【问题标题】:Oracle Date to_char Returns Different ResultsOracle Date to_char 返回不同的结果
【发布时间】:2016-11-23 10:29:17
【问题描述】:

我的本​​地开发机器上有一个数据库,我们的测试服务器上有一个数据库。基本上,我的开发机器上的表是从测试机器上复制过来的。

但是,我发现to_char 函数处理同一日期的方式有所不同。如果我运行以下查询,则在我的开发机器上:

select test_date, to_char(test_date, 'YYYY-MM-DD')
from test.table
where id = 'C0007784'

我得到以下结果:

31-DEC-99 1999-12-31

在针对相同架构和数据运行相同查询的测试服务器上,我得到以下信息:

31-DEC-99 1899-12-31

to_char 的这种行为差异可能是由于两个 Oracle 实例中的设置不同造成的吗?

如果我运行 SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT'; 两个实例都会得到 DD-MON-RR

【问题讨论】:

  • 你确定底层数据是一样的吗?
  • 如果是相同的数据这是不可能的。
  • 您能否准确描述一下该表是如何从测试机复制的?
  • @DavidBrower 不,它没有。年份格式的唯一正确方法是 4 位数字。用 YYYY 显示结果,我们看看是否相同。
  • 那么你可能会导出像31-DEC-99 这样的stings。这可能在目标数据库中被错误解释。叶芝应该总是四位数。显然你在上个世纪就没有在 IT 世界工作过,否则你会意识到“2000 年问题”。

标签: oracle date oracle11g


【解决方案1】:

因此,您使用 DD-MON-YY 格式将表的内容导出到 csv 文件。 YY 显然会引起歧义。我猜当您导入文件时,99 被解释为 1999 而不是 1899。我不知道数据库用来猜测全年的确切机制,但无论如何 Oracle strongly recommends YYYY in date format

注意:Oracle 建议您使用 4 位数的年份元素 (YYYY) 而不是较短的年份元素,原因如下: 4 位数 年份元素消除了歧义。

较短的年份元素可能会影响查询优化,因为 年在查询编译时是未知的,只能在 运行时间。

【讨论】:

  • 当我尝试将表的内容导出为 SQL 插入语句时,我看到1899-12-31 被插入为to_date('31-DEC-99','DD-MON-RR'),在我的开发数据库中变成1999-12-31 2012-02-23 被插入为to_date('23-FEB-12','DD-MON-RR') 并在我的开发数据库中成为2012-02-23
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2015-05-14
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多