如何在SQL Developer中获取带有日期值的两列中的月份差异?

时间:2018-12-27 09:28:35

标签: sql oracle-sqldeveloper

我想获得DT_1DT_2之间的整月差额。我尝试了datediffdatepartmonth,但是没有用...我使用SQL Developer,它显示:

  

ORA-00904:“ DATEPART”:无效的标识符   00904. 00000-“%s:无效的标识符”

数据:

+---------+-----------+---------------+
|   ID    | DT_1      | DT_2          |
+---------+-----------+---------------+
| C111111 | 2018/1/1  | 2018/1/1      | 
| C111112 | 2017/9/30 | 2018/10/25    | 
| C111113 | 2018/10/1 | 2018/10/31    | 
| C111114 | 2018/10/6 | 2018/12/14    | 
+---------+-----------+---------------+

预期结果:

  • 对于C111111,月份差应为01-1
  • 对于C111112,月份差应为1322-9
  • 对于C111113,月份差应为010-10
  • 对于C111114,月份差应为212-10

有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:4)

您可能需要查看DT_1和DT_2是否为日期类型,然后使用MONTHS_BETWEEN函数获取两个日期之间月份的日期差。如下所示:

SELECT MONTHS_BETWEEN  (TO_DATE('2018/1/1','YYYY/MM/DD'),  TO_DATE('2018/1/1','YYYY/MM/DD') ) "Months"  FROM DUAL;

OR

SELECT MONTHS_BETWEEN  (TO_DATE(DT_1,'YYYY/MM/DD'),  TO_DATE(DT_2,'YYYY/MM/DD') ) "Months"  FROM TableName;

答案 1 :(得分:0)

您要计算两个值之间的月份边界数。这不是months_between()所做的。取而代之的是,将这些值转换为自某个时间点以来的月数,然后求出差。

使用算术的简单方法:

select t.*,
       ( (extract(year from dt_2) * 12 + extract(month from dt_2)) -
         (extract(year from dt_1) * 12 + extract(month from dt_1))
       ) as month_difference
from t;

或者,您可以将trunc()months_between()一起使用:

select t.*,
       months_between(trunc(dt_2, 'MON'), trunc(dt_1, 'MON'))