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
Разница между датами в нужном формате
Поискал на форуме, не нашел нужного ответа/алгоритма/примера.
СУБД Firebird 2.1
На входе две даты, на выходе количество месяцев и дней, можно просто дробное значение месяцев. Функция DATEDIFF() не дает нужного результата. Самому в голову алгоритм не приходит.
Может найдется среди вас, у которого есть готовый вариант или какие-нить идеи.
Сдеал!!! Если кому нужно, то вот код: