Есть ли способ рассчитать количество лет между датами. Не знаете, как это сделать, учитывая скачок, а что нет. Возможно ли сделать оператор IF, возможно, в SELECT?
Спасибо
Есть ли способ рассчитать количество лет между датами. Не знаете, как это сделать, учитывая скачок, а что нет. Возможно ли сделать оператор IF, возможно, в SELECT?
Спасибо
Я бы использовал months_between
, возможно, в сочетании с floor
:
select floor(months_between(date '2012-10-10', date '2011-10-10') /12) from dual;
select floor(months_between(date '2012-10-9' , date '2011-10-10') /12) from dual;
floor
гарантирует, что вы пройдете круглые годы. Если вам нужны дробные части, вы, очевидно, не хотите использовать floor
.
Если вы просто хотите разницу в годах, есть:
SELECT EXTRACT(YEAR FROM date1) - EXTRACT(YEAR FROM date2) FROM mytable
Или вам нужны дробные годы?
SELECT (date1 - date2) / 365.242199 FROM mytable
365.242199 - 1 год в днях, согласно Google.
Мне пришлось реализовать функцию учета года, которая работает аналогично sybase dateiff. В этом случае учитывается разница в реальном году, а не округленная разница в день. Поэтому, если две даты разделены на один день, разница в году может быть 1 (см. select datediff(year, '20141231', '20150101')
).
Если значение diff года должно учитываться таким образом, используйте:
EXTRACT(YEAR FROM date_to) - EXTRACT(YEAR FROM date_from)
Только для журнала (почти) полная датированная функция:
CREATE OR REPLACE FUNCTION datediff (datepart IN VARCHAR2, date_from IN DATE, date_to IN DATE)
RETURN NUMBER
AS
diff NUMBER;
BEGIN
diff := CASE datepart
WHEN 'day' THEN TRUNC(date_to,'DD') - TRUNC(date_from, 'DD')
WHEN 'week' THEN (TRUNC(date_to,'DAY') - TRUNC(date_from, 'DAY')) / 7
WHEN 'month' THEN MONTHS_BETWEEN(TRUNC(date_to, 'MONTH'), TRUNC(date_from, 'MONTH'))
WHEN 'year' THEN EXTRACT(YEAR FROM date_to) - EXTRACT(YEAR FROM date_from)
END;
RETURN diff;
END;";
Необходимо найти разницу в году, если високосный год составляет 366 дней.
Я не очень много работаю в oracle, пожалуйста, сделайте это лучше. Вот как я это сделал:
SELECT CASE
WHEN ( (fromisleapyear = 'Y') AND (frommonth < 3))
OR ( (toisleapyear = 'Y') AND (tomonth > 2)) THEN
datedif / 366
ELSE
datedif / 365
END
yeardifference
FROM (SELECT datedif,
frommonth,
tomonth,
CASE
WHEN ( (MOD (fromyear, 4) = 0)
AND (MOD (fromyear, 100) <> 0)
OR (MOD (fromyear, 400) = 0)) THEN
'Y'
END
fromisleapyear,
CASE
WHEN ( (MOD (toyear, 4) = 0) AND (MOD (toyear, 100) <> 0)
OR (MOD (toyear, 400) = 0)) THEN
'Y'
END
toisleapyear
FROM (SELECT (:todate - :fromdate) AS datedif,
TO_CHAR (:fromdate, 'YYYY') AS fromyear,
TO_CHAR (:fromdate, 'MM') AS frommonth,
TO_CHAR (:todate, 'YYYY') AS toyear,
TO_CHAR (:todate, 'MM') AS tomonth
FROM DUAL))