您只顯示兩位數字的年份組分。如果你顯示全年,那麼你可能會看到日期有錯誤的世紀。
此外,而不是減去年獲得年的差異,你會得到更好的使用:
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
來源
2017-03-29 10:06:36
MT0
你肯定* *是生日設定爲1940年(假設這是問題)?我似乎記得甲骨文在1950年有一個關鍵點,所以兩個數字的日期將假定爲從1950年到2049年。 – paxdiablo
嘗試'選擇to_char(contact.BIRTHDATE,'dd/mm/yyyy')'並檢查結果。這將有可能告訴你,你的數據有問題。另外,請注意,將'to_date'應用於日期列是沒有意義的。 – Aleksej
我還試圖BUIT結果是: -32 \t 27/08/2049 26/01/1964 17/07/1983 26/10/1980 18/10/1954 ... –