2017-03-29 33 views
-1

我試圖使用功能EXTRACT得到來,用戶與此查詢:函數extract()不返回正確的結果

SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM contact.BIRTHDATE) AS CONTACT_YEARS 
FROM CONTACT contact 

但對於某些日期,例如:contact.BIRTHDATE = '27 -AGO-40'函數EXTRACT(YEAR FROM contact.BIRTHDATE)返回2040,查詢不起作用。

我也試過使用to_date(contact.BIRTHDATE, 'dd/mm/yyyy') 但日期格式不會改變。

謝謝!

+2

你肯定* *是生日設定爲1940年(假設這是問題)?我似乎記得甲骨文在1950年有一個關鍵點,所以兩個數字的日期將假定爲從1950年到2049年。 – paxdiablo

+0

嘗試'選擇to_char(contact.BIRTHDATE,'dd/mm/yyyy')'並檢查結果。這將有可能告訴你,你的數據有問題。另外,請注意,將'to_date'應用於日期列是沒有意義的。 – Aleksej

+0

我還試圖BUIT結果是: -32 \t 27/08/2049 26/01/1964 17/07/1983 26/10/1980 18/10/1954 ... –

回答

1

您只顯示兩位數字的年份組分。如果你顯示全年,那麼你可能會看到日期有錯誤的世紀。

此外,而不是減去年獲得年的差異,你會得到更好的使用:

TRUNC(MONTHS_BETWEEN(sysdate, birthdate)/12) 

甲骨文設置

CREATE TABLE contact(BIRTHDATE DATE); 

INSERT INTO contact (birthdate) 
SELECT DATE '1977-03-29' FROM DUAL UNION ALL 
SELECT DATE '77-03-29' FROM DUAL UNION ALL 
SELECT DATE '1977-03-30' FROM DUAL; 

查詢

SELECT TO_CHAR(birthdate, 'YYYY-MM-DD') AS full_year, 
     TO_CHAR(birthdate, 'YY-MM-DD') AS short_year, 
     EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM birthdate) AS age, 
     TRUNC(MONTHS_BETWEEN(sysdate, birthdate)/12) AS actual_age 
FROM contact; 

輸出

FULL_YEAR SHORT_YEAR AGE ACTUAL_AGE 
---------- ---------- ---- ---------- 
1977-03-29 77-03-29  40   40 
0077-03-29 77-03-29 1940  1940 
1977-03-30 77-03-30  40   39