【问题标题】:Different dates Oracle 11g with TOAD不同日期 Oracle 11g 与 TOAD
【发布时间】:2015-10-28 23:52:09
【问题描述】:

我有以下疑问:

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

【问题讨论】:

  • 您的问题中显示的 NLS_DATE_FORMAT 是产生 1949 年结果的那个吗?
  • 不,我添加了密钥,但仍然得到相同的结果
  • 如果 NLS_DATE_FORMAT 为 'YYYY/MM/DD',我希望你会得到一个格式为 '2049/02/01' 的日期。检查 TOAD 的配置中是否存在导致其使用“RR”或“RRRR”年份格式格式化日期的内容(有关 TO_CHAR 日期格式模型的文档,请参阅here)。

标签: sql oracle datetime oracle11g toad


【解决方案1】:

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

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,然后通过RR 掩码将其解释为@ 987654330@,这是预期的行为。

短版:永远不要依赖隐式日期转换或 NLS 日期格式掩码。

【讨论】:

  • 哇,这是一个很棒的解释,不知道我正在做多个隐式日期转换。第二,我不知道sqlfiddle。第三,我已经为所有这些信息给了你+1,但是明天@办公室,我要检查 TOAD 配置,看看当时的输出是如何设置的。
  • @Luis 我会忽略 Toad 或任何其他应用程序中的设置,并依赖明确的日期格式图片。很容易让不同的应用有不同的设置,然后代码是不可移植的。
  • '隐式日期转换'可能是错误的短语;这通常用于没有to_dateto_char 呼叫的情况,例如where sysdate &gt; '31-May-13' - 更糟糕的是,哪个值将被转换并不明显。在这种情况下,“隐式日期格式掩码”可能更好。
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2010-12-25
  • 2012-08-03
相关资源
最近更新 更多