我想在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)
任何帮助表示赞赏!
/*
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)
为了解决 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 所暗示的那样。
| 归档时间: |
|
| 查看次数: |
16995 次 |
| 最近记录: |