2013-11-23 48 views
0

EMPLOYEE表:使用比甲骨文少比較日期不能得到預期的答案

CREATE TABLE Employee(
    ID CHAR(10) PRIMARY KEY, 
    SSN CHAR(15) NOT NULL, 
    FNAME CHAR(15), 
    LNAME CHAR(15), 
    DOB DATE NOT NULL 
); 
INSERT INTO Employee VALUES('0000000001','078-05-1120','George','Brooks', '24-may-85'); 
INSERT INTO Employee VALUES('0000000002','917-34-6302','David','Adams', '01-apr-63'); 
INSERT INTO Employee VALUES('0000000003','078-05-1123','Yiling','Zhang', '02-feb-66'); 
INSERT INTO Employee VALUES('0000000004','078-05-1130','David','Gajos', '10-feb-65'); 
INSERT INTO Employee VALUES('0000000005','079-04-1120','Steven','Cox', '11-feb-79'); 
INSERT INTO Employee VALUES('0000000006','378-35-1108','Eddie','Gortler', '30-may-76'); 
INSERT INTO Employee VALUES('0000000007','278-05-1120','Henry','Kung', '22-may-81'); 
INSERT INTO Employee VALUES('0000000008','348-75-1450','Harry','Leitner', '29-oct-85'); 
INSERT INTO Employee VALUES('0000000009','256-90-4576','David','Malan', '14-oct-88'); 
INSERT INTO Employee VALUES('0000000010','025-45-1111','John','Brooks', '28-nov-78'); 
INSERT INTO Employee VALUES('0000000011','025-59-1919','Michael','Morrisett', '04-nov-85'); 
INSERT INTO Employee VALUES('0000000012','567-45-2351','David','Nelson', '10-nov-54'); 
INSERT INTO Employee VALUES('0000000013','100-40-0011','Jelani','Parkes', '20-dec-44'); 

當我使用類似的查詢:

SELECT * FROM EMPLOYEE WHERE DOB < '01-jan-80'; 

我沒有得到的「0000000013」的記錄, '100-40-0011','Jelani','Parkes','20 -dec-44'。 我認爲這可能是日期格式問題,但我不確定。任何人有想法?謝謝!

回答

2

您提供一年

然後一年< 50將20XX 和年> 50將19XX

意味着56將:

試試這個1956年是44 意味着2044

這就是爲什麼它被排除

3

那麼,你有一個DATE數據類型爲你的DOB列,所以,這是一件好事。但是,使用字符串指定日期時,應該使用明確的TO_DATE函數和4位數年來確切確定發生了什麼。在2位格式(RR)

INSERT INTO Employee VALUES('0000000001','078-05-1120','George','Brooks', to_date('24-may-1985','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000002','917-34-6302','David','Adams', to_date('01-apr-1963','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000003','078-05-1123','Yiling','Zhang', to_date('02-feb-1966','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000004','078-05-1130','David','Gajos', to_date('10-feb-1965','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000005','079-04-1120','Steven','Cox', to_date('11-feb-1979','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000006','378-35-1108','Eddie','Gortler', to_date('30-may-1976','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000007','278-05-1120','Henry','Kung', to_date('22-may-1981','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000008','348-75-1450','Harry','Leitner', to_date('29-oct-1985','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000009','256-90-4576','David','Malan', to_date('14-oct-1988','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000010','025-45-1111','John','Brooks', to_date('28-nov-1978','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000011','025-59-1919','Michael','Morrisett', to_date('04-nov-1985','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000012','567-45-2351','David','Nelson', to_date('10-nov-1954','dd-mon-yyyy')); 
INSERT INTO Employee VALUES('0000000013','100-40-0011','Jelani','Parkes', to_date('20-dec-1944','dd-mon-yyyy')); 

SELECT * FROM EMPLOYEE WHERE DOB < to_date('01-jan-1980','dd-mon-yyyy'); 
1

您的插入語句的日期沒有指定掩碼。這意味着它將使用默認日期掩碼。你可以用下面的查詢來檢查它的值:

select * from NLS_DATABASE_PARAMETERS 
where parameter = 'NLS_DATE_FORMAT'; 

年份是兩位數字格式;這意味着Oracle必須默認一個世紀。如果適用的掩碼是YY它將選擇當前世紀; 44將變爲2044,80將變成2080.

但是,看起來您可能有一個使用RR格式的掩碼,例如,DD-MON-RR。這適用於一個鈍的窗口來推導出一個世紀的缺乏一個的輸入日期,以50爲旋轉數。小於50的數字得到當前世紀,否則它們將得到前一個世紀。所以80年將成爲1950年,44年將成爲2044年。顯然,2044年不低於1980年。

如果您的數據庫使用RR作爲其默認日期掩碼,這是非常糟糕的做法。 RR格式是在上個千年的Y2K歇斯底里期間作爲緊急雜誌引入的。沒有現代系統應該仍然使用它。所有輸入應包含適當的完整日期和格式掩碼。

繼續依賴RR格式的系統將越來越多地被損壞。隨着21世紀的進展,RR窗口的關鍵點變得不太合適。沒有辦法改變樞軸點,因爲它只是作爲一個混亂。

最初的Y2K問題起源於一個真正的存儲問題:省略世紀數字節省了大量的空間。早在20世紀80年代就是這樣。空間對於十年(除了某些專業環境(例如嵌入式系統))沒有那麼大的問題。現代系統應該總是妥善處理世紀;不這樣做只是懶惰或無知。