+------------+------------+------+
| start_date | end_date | year |
+------------+------------+------+
| 01/01/2001 | 01/01/2002 | 1 |
| 01/01/2001 | 04/01/2002 | 1 |
| 01/01/2001 | 31/12/2001 | 1 |
| 01/01/2001 | 03/01/2011 | 10 |
| 01/01/2001 | 02/01/2101 | 100 |
+------------+------------+------+
在oracle中有两个日期,其中包含以下值:
+------------+------------+
| start_date | end_date |
+------------+------------+
| 01/01/2001 | 01/01/2002 |
+------------+------------+
我正在使用mod来计算差异是否为一年。 MOD(end_date-start_date,365)= 0
这适用于日期的微小差异,4年后我不能使用零和
start_date end_date
01/01/2001 01/01/2101
end_date-start_date = 36524
end_date-start_date != 365 * 100 (36500)
MOD(36500, 365) = 0
but
MOD(36524, 365) = 24
目的是了解年份是否在2年左右,大约3年左右, 大约4 ....
+------------+------------+
| start_date | end_date | year between
+------------+------------+
| 01/06/2013 | 01/06/2015 | 2
+------------+------------+
+------------+------------+
| 01/06/2013 | 08/08/2015 | NA
+------------+------------+
+------------+------------+
| 31/05/2013 | 02/06/2015 | 2
+------------+------------+
+------------+------------+
| 25/05/2013 | 02/06/2015 | NA
+------------+------------+
有什么想法吗?我会尝试使用:
MOD(end_date-start_date,365.242199)
在测试MODULE选项后,我决定采用dnoeth提供的以下解决方案:
case when end_date between
add_months(start_date, round(months_between(end_date, start_date)/12)*12) - 5
and
add_months(start_date, round(months_between(end_date, start_date)/12)*12) + 5
then
round(months_between(end_date, start_date) / 12)
谢谢,
答案 0 :(得分:2)
如果您想要大约一年(减去5天仍然被认为是一年),您可以在结束日期添加五天并使用months_between:
TRUNC(MONTHS_BETWEEN(end_date+5, start_date)/12)
编辑: 添加更多信息之后,我认为这可能有用:如果基于strat_date它是加/减五天
case when add_months(start_date, trunc(months_between(end_date+5, start_date) / 12)*12)
between end_date - 5 and end_date + 5
then trunc(months_between(end_date+5, start_date) / 12)
end
答案 1 :(得分:1)
为什么不使用简单的MONTHS_BETWEEN
函数?
例如:
SELECT TRUNC(MONTHS_BETWEEN(end_date, start_date)/12) FROM TTABLE
即:
WITH dates AS (SELECT TO_DATE('01.01.2001','DD.MM.YYYY') START_DATE,
TO_DATE('01.01.2003','DD.MM.YYYY') END_DATE
FROM DUAL)
SELECT START_DATE, END_DATE, TRUNC(MONTHS_BETWEEN(END_DATE, START_DATE)/12) YEARS_BETWEEN FROM dates