答案 0 :(得分: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错误是一个应用程序问题,而不是存储问题。现有的每个应用程序仍然允许用户编写日期,因为14-OCT-09正在使错误永久化。如果RR面具鼓励这种懒惰,那就会使事情变得更糟。
答案 1 :(得分: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,从OS环境继承并覆盖数据库的错误默认值。
这些都不是Oracle软件的错误,只要系统和编程语言允许2位数年,就应该注意“Y2K”问题。
答案 2 :(得分:1)
是的,看起来他们做了:
http://news.cnet.com/Oracle-offers-free-Y2K-upgrade/2100-1001_3-222123.html
不确定他们是否面对你所指的那个。
答案 3 :(得分:1)
可能稍微偏离主题,但......
我在Y2K期间为Oracle支持工作,包括翻身之夜。
我们整晚都打了一个电话 - 客户要求提供Oracle Y2K声明的副本。有点迟到了。 :)
除此之外,不要记得接到任何有关Y2K问题的电话。 (请注意,我在RDBMS服务器组中不起作用)