3

我的猜测是它不应该有,因为他们在日期中也使用世纪

这里开始

DATE 数据类型存储年(包括世纪)、月、日、小时、分钟和秒(午夜之后)。

它遇到问题了吗?

4

4 回答 4

6

是的,Oracle 受到 Y2K 错误的影响。在 Oracle 7 之前,数据库不存储世纪。向后兼容性意味着 Oracle 7 数据库使用 DD-MON-YY 作为日期的默认格式掩码。如果您使用该掩码创建日期,则世纪默认为当前世纪。现在仍然存在上个世纪的日期或下个世纪的日期的问题。严格来说,这是一个应用程序问题,而不是存储问题。

作为此 Oracle 的一种变通方法,将 RR 元素引入日期掩码,它基于日期窗口派生一个世纪。这是为了显示目的。当然,这种变通方法现在已成为一种嵌入式功能,并导致其自身的各种问题。尤其是因为应用程序将其用作输入格式掩码,而不是要求用户明确输入世纪。

无论如何,这就是它的工作原理。

SQL> insert into t72 values (1, to_date('12-MAY-32', 'DD-MON-YY'))
  2  /

1 row created.

SQL> insert into t72 values (2, to_date('12-MAY-99', 'DD-MON-YY'))
  2  /

1 row created.

SQL> insert into t72 values (3, to_date('12-MAY-50', 'DD-MON-YY'))
  2  /

1 row created.

SQL> insert into t72 values (11, to_date('12-MAY-32', 'DD-MON-RR'))
  2  /

1 row created.

SQL> insert into t72 values (12, to_date('12-MAY-99', 'DD-MON-RR'))
  2  /

1 row created.

SQL> insert into t72 values (13, to_date('12-MAY-50', 'DD-MON-RR'))
  2  /

1 row created.

SQL> insert into t72 values (14, to_date('12-MAY-49', 'DD-MON-RR'))
  2  /

1 row created.

SQL>

表格内容:

SQL> alter session set nls_date_format = 'DD-MON-YYYY'
  2  /

Session altered.

SQL> select * from t72
  2  /

        ID D
---------- -----------
         1 12-MAY-2032
         2 12-MAY-2099
         3 12-MAY-2050
        11 12-MAY-2032
        12 12-MAY-1999
        13 12-MAY-1950
        14 12-MAY-2049

7 rows selected.

SQL>

1-49 年分配 19 和 0、50-99 分配 20。


值得重申的是,在 Oracle 中,Y2K 错误是一个应用程序问题,而不是存储问题。每个现有的应用程序仍然允许用户编写日期,因为 09 年 14 月 14 日使该错误永久存在。就 RR 面具鼓励这种懒惰而言,它使事情变得更糟。

于 2010-08-12T15:06:38.673 回答
2

正如 APC 所说,自 V7 以来,Oracle 已经以完整的日期时间格式存储日期,并且大多数客户端应用程序还在 2K 截止日期之前的某个时间更正了任何使用显式 -YY 格式掩码的情况。

但是,我已经看到自 2K 以来发生的错误,人们重新使用 -YY 格式掩码,并且在测试中没有注意到,因为他们的所有测试数据都是 Y2K 后的 - 特别是在进行日期/字符串/日期操作时 - 人为例子 :

TO_DATE(TO_CHAR(a_date_column,'DD-MM-YY')||'12:00','DD-MM-YYHH24:MI')

如果您正在处理将日期和时间存储为单独的数据库列的遗留系统,这种逻辑是很常见的。语法可能是特定于 Oracle 的,但问题实际上是通用编程问题。

我看到与 Oracle 相关的更多问题是围绕 NLS 日期设置。我见过 DBA 重建数据库但将默认格式设置回 -YY,我还看到 JDBC 连接将会话格式设置为 -YY、从操作系统环境继承并覆盖数据库导致的错误默认。

这些都不是 Oracle 软件的错误,只要系统和编程语言允许 2 位数年份,“Y2K”问题就会存在,这是值得的。

于 2010-08-12T17:51:06.163 回答
1

是的,看起来他们做到了:

http://news.cnet.com/Oracle-offers-free-Y2K-upgrade/2100-1001_3-222123.html

不确定他们是否遇到了您所指的确切问题。

于 2010-08-12T14:28:27.927 回答
1

可能有点题外话,但是......

在 Y2K 期间,我一直在为 Oracle Support 工作,包括过渡之夜本身。

我们整晚都接到一个电话——一位客户要求提供一份甲骨文的 Y2K 声明副本。有点晚了我想。:)

除此之外,不要记得接到任何关于千年虫问题的电话。(请注意,虽然我没有在 RDBMS 服务器组工作)

于 2010-08-12T15:06:57.890 回答