函数EXTRACT()没有返回正确的结果 [英] Function EXTRACT() does not return the correct result

查看:91
本文介绍了函数EXTRACT()没有返回正确的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用函数EXTRACT来获得使用此查询的年数用户:

I'm trying to get the years users with this query using the function 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,查询不起作用.

but for some dates, for example: contact.BIRTHDATE = '27-AGO-40' the function EXTRACT(YEAR FROM contact.BIRTHDATE) return 2040 and query does not work.

我也尝试使用to_date(contact.BIRTHDATE, 'dd/mm/yyyy') 但日期格式不会改变.

I also tried using to_date(contact.BIRTHDATE, 'dd/mm/yyyy') but the date format does not change.

谢谢!

推荐答案

您只用两位数字显示日期的年部分.如果显示全年,则可能会看到日期的世纪不正确.

You are only displaying the year component of the date with two-digits. If you display the full year then you will likely see that the dates have the incorrect century.

此外,与其减去年份来获得年差,不如使用以下方法更好:

Also, rather than subtracting the years to get the difference in years, you would be better using:

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

这篇关于函数EXTRACT()没有返回正确的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆