函数EXTRACT()不返回正确的结果

时间:2017-03-29 09:23:27

标签: sql oracle

我正在尝试使用函数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') 但日期格式不会改变。

谢谢!

1 个答案:

答案 0 :(得分:1)

您只显示两位数的日期年份部分。如果您显示全年,那么您可能会看到日期具有不正确的世纪。

此外,您可以更好地使用:

,而不是减去年份以获得多年的差异
TRUNC( MONTHS_BETWEEN( sysdate, birthdate ) / 12 )

Oracle安装程序

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