Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разница между датами в нужном формате

23K
19 ноября 2009 года
Gluckodrom
30 / / 08.01.2008
Здравствуйте, уважаемые.
Поискал на форуме, не нашел нужного ответа/алгоритма/примера.

СУБД Firebird 2.1

На входе две даты, на выходе количество месяцев и дней, можно просто дробное значение месяцев. Функция DATEDIFF() не дает нужного результата. Самому в голову алгоритм не приходит.
Может найдется среди вас, у которого есть готовый вариант или какие-нить идеи.
23K
19 ноября 2009 года
Gluckodrom
30 / / 08.01.2008
Сдеал!!! Если кому нужно, то вот код:

Код:
CREATE PROCEDURE RAZNICA_MEJDU_DATAMI (
    p_data_nach date,
    p_data_kon date)
returns (
    r_year integer,
    r_month integer,
    r_day integer)
as
begin
  if (:P_DATA_NACH >= :P_DATA_KON) then
    begin
        r_year = 0;
        r_month = 0;
        r_day = 0;

    end
  else
    begin

        -- вычислили разницу в днях
        r_year = DATEDIFF(year, :P_DATA_NACH, :P_DATA_KON);

        -- увеличили на разницу в годах, если больше, то уменьшаем на 1 год
        P_DATA_NACH = DATEADD(year, :r_year, :P_DATA_NACH);
        if (:P_DATA_NACH > :P_DATA_KON) then
            begin
                r_year = :r_year - 1;
                P_DATA_NACH = DATEADD(year, -1, :P_DATA_NACH);
            end

        -- вычислили разницу в месяцах
        r_month = DATEDIFF(month, :P_DATA_NACH, :P_DATA_KON);

         -- увеличили на разницу в месяцах, если больше, то уменьшаем на 1 месяц
        P_DATA_NACH = DATEADD(month, :r_month, :P_DATA_NACH);
        if (:P_DATA_NACH > :P_DATA_KON) then
            begin
                r_month = :r_month - 1;
                P_DATA_NACH = DATEADD(month, -1, :P_DATA_NACH);
            end

        -- вычислили разницу в днях
        r_day = DATEDIFF(day, :P_DATA_NACH, :P_DATA_KON);

        -- увеличили на разницу в днях, если больше, то уменьшаем на 1 день
        P_DATA_NACH = DATEADD(day, :r_day, :P_DATA_NACH);
        if (:P_DATA_NACH > :P_DATA_KON) then
            begin
                r_day = :r_day - 1;
                P_DATA_NACH = DATEADD(day, -1, :P_DATA_NACH);
            end
    end
end
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог