我有以下问题:
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提前感谢!
发布于 2013-05-31 11:53:00
TO_DATE和TO_CHAR这两个函数都有三个参数。如果未指定最后两个参数,则为默认值。
第二个参数是格式。它将默认为NLS_DATE_FORMAT会话参数值。由于您在转换过程中可能会丢失信息,因此没有理由假定这两个函数是相反的。
让我们以默认格式的糟糕选择(DD-MON-RR)为例:
SQL> select to_date('01-FEB-1949', 'DD-MON-RR') d from dual;
D
------------------------------
01/02/1949
SQL> SELECT to_char(to_date('01-FEB-1949', 'DD-MON-RR'),
2 'DD-MON-RR') c
3 FROM dual;
C
------------------------------
01-FEB-49
SQL> SELECT to_date(to_char(to_date('01-FEB-1949', 'DD-MON-RR'),
2 'DD-MON-RR'),
3 'DD-MON-RR') d
4 FROM dual;
D
-----------
01/02/2049这表明,我们在第二步中丢失了数据:世纪已经消失了!第三步必须弥补它,并使用违约规则RR:
我们在第一个例子中,选择的世纪是当前的世纪(20 in )。
最后:
RR或YY格式,因为一年有4位数字(听说过Y2K错误吗?)MON月格式,如果有人使用另一个区域NLS设置:月份使用不同语言的不同缩写,您的应用程序将无法工作!https://dba.stackexchange.com/questions/43483
复制相似问题