oracle plsql order by Birth of Birth列不起作用

时间:2012-09-11 19:26:31

标签: sql oracle

我有一个名为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 

我无法弄清楚如何获得正确的订单。如何查询正确的订单?

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.

这里是原始文档文本

enter image description here

来源:Oracle®数据库 SQL语言参考 11g第2版(11.2) E26088-01

查看SQL Fiddle

答案 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”的方式。