0

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

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

4

3 回答 3

5

您的数据按时间顺序排列。问题是您使用 'DD-MM-RRRR' 而不是 'DD-MM-YY' 进行转换。

“RRRR”版本使用特定规则来获得世纪。因此,您的第一行是 2045-10-01,而不是 1945-20-01。

于 2012-09-11T19:31:22.393 回答
3

使用 YYYY 而不是 RR 进行插入,因为 RR 仅对低于 1950 的日期添加 1900,而对高于 1950 的日期添加 2000。

这里是原始文档文本

在此处输入图像描述

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

看看SQL Fiddle

于 2012-09-11T19:30:18.307 回答
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”的方式。

于 2012-09-11T19:32:23.797 回答