不同日期Oracle 11g与TOAD

时间:2013-05-30 22:40:52

标签: sql oracle datetime oracle11g toad

我有以下疑问:

SELECT to_date(to_char(to_date('01-FEB-1949'))) FROM DUAL;  
/*this returns 2/1/2049. */

SELECT to_date(to_char(to_date('01-FEB-1949'),'dd-MON-yyyy')) FROM DUAL; 
/*this returns 2/1/1949.*/

为什么第一个返回年份2049而不是1949

通过谷歌搜索我发现我可以强迫"通过更改注册表上的key来确定客户端日期格式:

KEY_OraClient11g_home1
NLS_DATE_FORMAT : YYYY/MM/DD

1 个答案:

答案 0 :(得分:5)

您在两个版本中都进行了多次隐式日期转换。这样:

SELECT to_date(to_char(to_date('01-FEB-1949'))) FROM DUAL; 

相当于:

SELECT to_date(to_char(to_date('01-FEB-1949', <NLS_DATE_FORMAT>),
    <NLS_DATE_FORMAT>, <NLS_DATE_FORMAT>)) FROM DUAL;

而第二个查询中有一个用特定格式替换。它看起来像您的默认格式 - 我相信,您可以在Toad首选项中设置,而无需直接修改注册表;目前尚不清楚你是否甚至修改了与Toad相关的内容 - DD-MON-RR,如将其插入这些查询所示:

SELECT to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
        'DD-MON-RR'),'DD-MON-RR') AS date1,
    to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
        'dd-MON-yyyy'),'DD-MON-RR') AS date2 FROM DUAL;

DATE1                            DATE2
February, 01 2049 00:00:00+0000  February, 01 1949 00:00:00+0000

SQL Fiddle

您可以在this SQL Fiddle中看到,在第一个版本中,日期显示为年份为49而不是1949的字符串,然后由{解释 - {1}}掩码 - 为RR,这是预期的行为。

简短版本:绝不依赖隐式日期转换或NLS日期格式掩码。