gpt4 book ai didi

Oracle 11.1 将儒略日数转换为 DATE 或 TIMESTAMP 时出现错误

转载 作者:行者123 更新时间:2023-12-02 02:35:23 25 4
gpt4 key购买 nike

This recent post让我忙于研究 Oracle 中的儒略日期转换,并且我发现了 Oracle 11.1 中的一个错误。测试用例是:

案例1。

SELECT TO_CHAR(TO_TIMESTAMP('0', 'J'), 'DD MON SYYYY') FROM DUAL

这应该返回“01 JAN -4713”,如定义 here ,而是引发错误

ORA-01854: julian date must be between 1 and 5373484

案例2。

SELECT TO_CHAR(TO_TIMESTAMP('1', 'J'), 'DD MON SYYYY') FROM DUAL

这应该返回“02 JAN -4713”作为上述内容的扩展(比儒略零日期晚一天),但返回“01 JAN -4712”(比一年少一天)。

案例3。

SELECT TO_CHAR(TO_TIMESTAMP('1721424', 'J'), 'DD MON SYYYY') FROM DUAL

返回“0001 年 1 月 1 日”。没关系(就目前而言)。如果我们从上面的日期值中减去 1,我们期望它返回前一天,即 31 DEC -0001(零年不存在);但是,当我们执行以下命令时

SELECT TO_CHAR(TO_TIMESTAMP('1721423', 'J'), 'DD MON SYYYY') FROM DUAL

抛出以下错误:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

表明 Oracle 已尝试生成零年份。

(请注意,虽然上面的测试用例中使用了 TO_TIMESTAMP,但使用 TO_DATE 时也会出现完全相同的问题)。

有谁知道吗

  1. Oracle 已记录这些问题?
  2. 这些问题在 11.2 中还存在吗?

分享并享受。

<小时/>

根据 Phil 下面的回答,这些问题在 11.2 中仍然出现。

克苏鲁 fhtagn。

<小时/>

10.2.0.4 中存在相同错误

最佳答案

当试图了解 Oracle 应该做什么时,请查看 Oracle 的 documentation ,“儒略日数是自公元前 4712 年 1 月 1 日以来的天数。”

该措辞确实暗示儒略日 1 是自公元前 4712 年 1 月 1 日起的一天,换句话说,是 1 月 2 日。然而,儒略日期计算的当前实现已经存在很长时间了,现有代码取决于行为上。 (我知道,如果 Oracle 中实现的 Julian 定义发生变化,我们就会完蛋。)此时,自公元前 4713 年 12 月 31 日以来最多只是一个文档错误。

编辑发现 reference朱利安 1 是 1 月 1 日,在 Call Interface Programmer's Guide 中。普通数据库程序员不会去关注的地方。

下面解释一下 wikipedia 和 Oracle 之间的年份差异:

Oracle Database uses the astronomical system of calculating Julian days, in which the year 4713 BC is specified as -4712. The historical system of calculating Julian days, in contrast, specifies 4713 BC as -4713. If you are comparing Oracle Julian days with values calculated using the historical system, then take care to allow for the 365-day difference in BC dates. For more information, see http://www.usno.navy.mil/USNO/astronomical-applications/astronomical-information-center/millennium.

案例 3 对我来说是新闻。谢谢你提出来。我不知道有任何涉及该行为的引用资料。相关:

SQL> select to_date('0001-01-01', 'YYYY-MM-DD') 
- to_date ('-0001-12-31', 'SYYYY-MM-DD') from dual;

TO_DATE('0001-01-01','YYYY-MM-DD')-TO_DATE('-0001-12-31','SYYYY-MM-DD')
-----------------------------------------------------------------------
367

SQL> select months_between(to_date('0001-01-01', 'YYYY-MM-DD')
2 , to_date ('-0001-12-31', 'SYYYY-MM-DD')) from dual;

MONTHS_BETWEEN(TO_DATE('0001-01-01','YYYY-MM-DD'),TO_DATE('-0001-12-31','SYYYY-MM-DD'))
---------------------------------------------------------------------------------------
12.0322581

显然不存在的 0 年是闰年。

关于Oracle 11.1 将儒略日数转换为 DATE 或 TIMESTAMP 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com