年,同月和同一天的两个日期之间的差异

时间:2014-03-05 09:07:17

标签: sql oracle plsql

+------------+------------+------+
| 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)

谢谢,

2 个答案:

答案 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