我在使用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') ==>日期显示为10-7月-2016年7月
但是当使用to_date(column2, 'dd-mon-RR') ==>时,日期显示为08-7-2016。
当我在查询中使用以下内容时,我会得到一个奇怪的数字
to_date(column1, 'dd-mon-yyyy') - to_date(column2, 'dd-mon-RR') ==> -730463
你的帮助真的很感激!
发布于 2018-10-05 13:10:36
问题在于,您正在尝试使用TO转换已经是日期的列。
TO_DATE将CHAR、VARCHAR2、NCHAR或NVARCHAR2数据类型的字符转换为日期数据类型的值。
由于您已经以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 dual10-jul-16是您从上面看到的(同样由于会话的NLS格式),但它实际上是10-jul-0016而不是10-Jul-2016
而表达式08-jul-2016.的计算值为to_date(column2, 'dd-mon-RR')。这是因为如果我没有错的话,您的NLS_DATE_FORMAT设置为'DD-MON-RR'。
所以,你看到的奇怪的数字是这两个日期的区别。
如果您想确认,只需运行这个。也就是说,将日期文字减去纯日期,而不进行转换。
SELECT DATE '0016-08-03' - DATE '2016-07-08' FROM dual;-- -730461发布于 2018-10-05 12:30:47
你试过用
to_date(column1, 'dd-mon-RRRR') - to_date(column2, 'dd-mon-RRRR')当你在约会时,总是使用RRRR。这将确保具有按照y2k的日期格式。
如果这不能解决您的问题,请共享这些Column1和Column2的列类型
https://stackoverflow.com/questions/52665444
复制相似问题