【问题标题】:Oracle date column showing the wrong valueOracle 日期列显示错误值
【发布时间】:2014-03-14 17:26:59
【问题描述】:

我正在尝试找出表格中日期列中的问题。 数据库是Oracle 11g。

情况是: 当我运行以下查询时:

select to_char(data_val, 'DD/MM/YYYY'), a.data_val from material a order by a.data_val asc;

结果的前五行是:

00/00/0000 | 29/06/5585 00:00:00 00/00/0000 | 29/06/5585 00:00:00 00/00/0000 | 29/06/5585 00:00:00 1111 年 11 月 11 日 | 11/11/1111 00:00:00 1500 年 1 月 1 日 | 01/01/1500 00:00:00

问题是:

为什么前三行的 to_char 函数返回不同的日期值(00/00/0000)?

为什么日期 29/06/5585 是 ASC 日期排序的第一个结果?使用:order by data_val DESC 是正确的,不是吗?

【问题讨论】:

  • 根据 to_char 返回的值,结果排序正确。我的猜测是 data_val 列不是 Date 数据类型。我不确定 Oracle 可以处理的最小和最大日期是多少,但我认为 1500 为时过早。由于 data_val 不是日期类型,我希望前 3 个给出一些合理的东西,而后两个似乎没有改变,如果 Oracle 不将它们识别为日期,这是一个结果。检查 Oracle 支持的日期范围,以及 to_char 采用的格式(是 MM 月还是分钟?)
  • 似乎不是 Oracle 限制。 SELECT TO_CHAR(DATE '5585-06-29', 'MM/DD/YYYY') FROM Dual; 工作正常。
  • dava_val 列是日期类型。根据 oracle 文档:Oracle 数据库可以存储儒略时代的日期,范围从公元前 4712 年 1 月 1 日到公元 9999 年 12 月 31 日(共同时代,或“公元”)
  • 一定是我们没有看到的东西。你能在 SQLFiddle 上发布一个重现吗?

标签: sql oracle date oracle11g


【解决方案1】:

我们遇到了同样的问题。我可以确认“日期”列确实是 DATE 类型。 有问题的日期是 2014 年 5 月 1 日,因此很可能与原始帖子中的大年数无关。当您对日期执行一些计算时,问题就解决了,即 TO_CHAR(datum) 将全为零,TO_CHAR(datum + 1) 将如预期一样,甚至 TO_CHAR(datum +1 -1) 也是正确的。 (TO_CHAR(datum+0) 没有帮助:))

根据 DUMP 值,问题似乎在于我们以某种方式设法存储了 2014 年 4 月 31 日而不是 2014 年 5 月 1 日(现在调查这是如何可能的;我相信是 Informatica + Oracle 11.2) .

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2017-08-05
    • 1970-01-01
    • 2021-01-27
    • 2021-08-13
    • 2021-09-10
    • 2013-12-16
    • 2018-03-22
    • 2015-12-09
    相关资源
    最近更新 更多