首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同日期甲骨文11g与蟾蜍

不同日期甲骨文11g与蟾蜍
EN

Database Administration用户
提问于 2013-05-30 22:25:00
回答 1查看 4.5K关注 0票数 0

我有以下问题:

代码语言:javascript
复制
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来“强制”客户机日期格式:

代码语言:javascript
复制
KEY_OraClient11g_home1
NLS_DATE_FORMAT : YYYY/MM/DD

提前感谢!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-05-31 11:53:00

TO_DATETO_CHAR这两个函数都有三个参数。如果未指定最后两个参数,则为默认值。

第二个参数是格式。它将默认为NLS_DATE_FORMAT会话参数值。由于您在转换过程中可能会丢失信息,因此没有理由假定这两个函数是相反的。

让我们以默认格式的糟糕选择(DD-MON-RR)为例:

代码语言:javascript
复制
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

  • 如果指定的两位数年份为00至49,则
    • 如果当前年份的最后两位数为00至49,则返回年份的前两位数与当前年份相同。
    • 如果当前年份的最后两位数为50到99,则返回年份的前2位数字比当前年份的前2位数大1。

  • 如果指定的两位数年份为50至99,则
    • 如果当前年份的最后两位数为00到49,则返回年份的前2位数字比当前年份的前2位数少1。
    • 如果当前年份的最后两位数为50至99,则返回年份的前两位数与当前年份相同。

我们在第一个例子中,选择的世纪是当前的世纪(20 in )。

最后:

  • 不要依赖会话参数进行转换,因为它们可以在您的控制范围之外更改,请使用显式转换规则。
  • 不要使用RRYY格式,因为一年有4位数字(听说过Y2K错误吗?)
  • 在此期间,不要使用MON月格式,如果有人使用另一个区域NLS设置:月份使用不同语言的不同缩写,您的应用程序将无法工作!
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/43483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档