不同格式的两个日期之间的Oracle SQL Developer日期差异

时间:2018-10-05 12:16:39

标签: oracle oracle-sqldeveloper

我在使用SQL DEVELOPER时遇到了一个奇怪的问题,我有两个日期希望得到两者之间的区别:但是,我得到的结果不准确...

我有:

 column1 with the date 03-Aug-2016
 column2 with the date 08-July-2016

在将to_date函数与以下内容一起使用时:

to_date(column1, 'dd-mon-yyyy') ==>日期显示为03-Aug-2016

但是column2是另外一个故事,因为它给出了以下内容:

to_date(column2, 'dd-mon-yyyy') ==>日期显示为 2016年7月10日

但是使用to_date(column2, 'dd-mon-RR') ==>时,日期显示为 2016年7月8日

当我在查询中使用以下内容时,我会得到一个奇怪的数字

to_date(column1, 'dd-mon-yyyy') - to_date(column2, 'dd-mon-RR') ==> -730463

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

问题是您正在尝试使用TO_DATE

转换已经是日期的列
  

TO_DATE转换CHAR,VARCHAR2,NCHAR或NVARCHAR2的char   数据类型转换为DATE数据类型的值。

由于您提供的第一个参数为DATE类型,因此Oracle将使用会话的NLS参数将其隐式转换为字符串。

因此,to_date(column2, 'dd-mon-yyyy')等同于

SELECT TO_DATE(TO_CHAR(DATE '2016-07-08', ( -- 08-July-2016
     SELECT value
     FROM nls_session_parameters
     WHERE parameter = 'NLS_DATE_FORMAT' 
) ),'dd-mon-yyyy')
FROM dual

10-jul-16 是您从上面看到的内容(同样由于会话的NLS格式),但实际上是 10-jul-0016 并且不是 10-Jul-2016

表达式to_date(column2, 'dd-mon-RR')的计算结果为 08-jul-2016 。这是因为如果我没记错的话,您的NLS_DATE_FORMAT设置为'DD-MON-RR'

所以,您看到的怪异数字是两个日期之间的差。

如果要确认,只需运行此命令即可。即将日期文字减去为纯日期而不进行转换。

SELECT DATE '0016-08-03' - DATE '2016-07-08' FROM dual;--  -730461

答案 1 :(得分:0)

您尝试过使用

to_date(column1, 'dd-mon-RRRR') - to_date(column2, 'dd-mon-RRRR')

在处理日期时,始终使用PRRR。这样可以确保日期格式符合y2k。

如果这不能解决您的问题,请共享这些Column1和Column2所具有的列类型