Oracle查询计算当前年龄

use*_*986 3 sql oracle

我想在Oracle表中从DOB(出生日期)字段计算当前人的年龄.

DOB字段的数据类型是varchar,日期以"DD-MON-YY"格式存储.

当我从日期计算一个人的当前年龄时,10-JAN-49查询将返回年龄为负数.此外,我观察到如果日期为13至49年,则会给出负面结果.

例子

22-NOV-83 -valid result
09-FEB-58 --valid result
05-JUN-49 - Invalid result like -36
Run Code Online (Sandbox Code Playgroud)

查询已执行以供参考

select round(MONTHS_BETWEEN(sysdate,to_date(dob,'DD-MON-RR'))/12)||' Yrs' 
from birth
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

the*_*slk 5

/*
A value between 0-49 will return a 20xx year.
A value between 50-99 will return a 19xx year.
*/
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.techonthenet.com/oracle/functions/to_date.php

SELECT  FLOOR
        (
            MONTHS_BETWEEN
            (
                SYSDATE
            ,   TO_DATE(SUBSTR(d_date, 1, 7) || '19' || SUBSTR(d_date, -2, 2), 'DD-MON-YYYY')
            ) / 12
        )
FROM
(
        SELECT  '10-JAN-49' d_date FROM DUAL
)

-- The result: 64
Run Code Online (Sandbox Code Playgroud)


Ron*_*nie 5

为了解决 21 世纪的问题,只需稍微修改@the_silk 的答案:

SELECT
  CASE WHEN SUBSTR(dob, -2, 2) > 13
  THEN FLOOR
        (
            MONTHS_BETWEEN
            (
                SYSDATE
            ,   TO_DATE(SUBSTR(dob, 1, 7) || '19' || SUBSTR(dob, -2, 2), 'DD-MON-YYYY')
            ) / 12
        )
  ELSE
       FLOOR(MONTHS_BETWEEN(sysdate,TO_DATE(dob,'DD-MON-YY'))/12)
  END
FROM
birth
Run Code Online (Sandbox Code Playgroud)

请注意,这假定“00”和“13”之间的任何日期年份都是 21 世纪,因此只有在构建一次性脚本时才应使用此 sql,否则它将在此之前过时且无效长。

最好的解决方案是重建这个表,将 varchar 列转换为日期列,正如 Ben 所暗示的那样。