我在使用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
非常感谢您的帮助!
答案 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所具有的列类型