我有一个名为datetest的表
CREATE TABLE "DATETEST"."DATETEST"
("FNAME" VARCHAR2(20 BYTE),
"DOB" DATE,
"STAFFNO" NUMBER NOT NULL ENABLE,
CONSTRAINT "DATETEST_PK" PRIMARY KEY ("STAFFNO"));
包含以下数据
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('John', TO_DATE('01- OCT-45', 'DD-MON-RR'), '1')
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('Ann', TO_DATE('01-NOV-60', 'DD-MON-RR'), '2')
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('David', TO_DATE('24-MAR-58', 'DD-MON-RR'), '3')
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('Mary', TO_DATE('19-FEB-70', 'DD-MON-RR'), '4')
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('Susan', TO_DATE('03-JUN-40', 'DD-MON-RR'), '5')
INSERT INTO "DATETEST"."DATETEST" (FNAME, DOB, STAFFNO) VALUES ('Julie', TO_DATE('13-JUN-65', 'DD-MON-RR'), '6')
当我执行以下查询时
select * from datatest order by dob desc
我得到以下结果
FNAME DOB STAFFNO
-------------------- --------- -------
John 01-OCT-45 1
Susan 03-JUN-40 5
Mary 19-FEB-70 4
Julie 13-JUN-65 6
Ann 01-NOV-60 2
David 24-MAR-58 3
我无法弄清楚如何获得正确的订单。如何查询正确的订单?
答案 0 :(得分:5)
您的数据按时间顺序排列。问题是您使用'DD-MM-RRRR'代替'DD-MM-YY'进行转换。
'RRRR'版本使用特定规则来获得世纪。所以,你的第一行是2045-10-01,而不是1945-20-01。
答案 1 :(得分:3)
使用YYYY而不是RR进行插入,因为RR仅为1950年以下的日期添加1900,并为1950年以上的日期添加2000.
这里是原始文档文本
来源:Oracle®数据库 SQL语言参考 11g第2版(11.2) E26088-01
答案 2 :(得分:3)
要查看存储的实际日期,请使用以下格式..
SQL> select fname,
2 to_char(dob,'dd-mon-yyyy') dob,
3 staffno
4 from datetest
5 order by dob desc;
FNAME DOB STAFFNO
-------------------- ----------- ----------
David 24-mar-1958 3
Mary 19-feb-1970 4
Julie 13-jun-1965 6
Susan 03-jun-2040 5
John 01-oct-2045 1
Ann 01-nov-1960 2
这可以帮助您查看“问题”。正如Gordon指出的那样(+1),这是因为Oracle在计算实际日期时解释了“RR”的方式。