3

我想从 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

查询已执行以供参考

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

任何帮助表示赞赏!

4

6 回答 6

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

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

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

于 2013-07-02T10:46:46.930 回答
5
/*
A value between 0-49 will return a 20xx year.
A value between 50-99 will return a 19xx year.
*/

来源: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
于 2013-07-02T09:53:51.970 回答
1
SELECT MONTHS_BETWEEN( to_date(sysdate,'dd-mm-rr')
                     , to_date(to_date(dob,'yymmdd'),'dd-mm-rr')
                     ) / 12 AS Years 
 FROM birth;

也许这行得通。

于 2013-09-18T20:34:16.013 回答
1

我的解决方案是这样的:

SELECT DATE_FORMAT(CURDATE(),'%Y') - DATE_FORMAT(dob,'%Y') as age
FROM `member_master`
having age >=30 and age <=35
于 2014-12-20T08:10:11.570 回答
0
SELECT year, 
       months, 
       Floor(SYSDATE - day_1) AS days 
FROM   (SELECT year, 
               months, 
               Add_months(To_date('30-Oct-1980', 'dd-Mon-yyyy'), 
               12 * year + months) 
                      day_1 
        FROM   (SELECT year, 
                       Floor(Trunc(Months_between(Trunc(SYSDATE), 
                                   To_date('30-Oct-1980', 'dd-Mon-yyyy') 
                                   )) 
                             - year * 12) AS months 
                FROM   (SELECT Floor(Trunc(Months_between(Trunc(SYSDATE), 
                                                   To_date('30-Oct-1980', 
                                                   'dd-Mon-yyyy' 
                                                   ) 
                                                           )) / 
                                                     12) AS year 
                        FROM   dual))); 
于 2016-10-27T12:14:03.960 回答
-1

尝试在 TO_DATE 的年份部分使用 YY

RR 与 YY 类似,但两位数字“四舍五入”为 1950 到 2049 范围内的年份。因此,06 被视为 2006 而不是 1906

于 2013-07-02T09:54:11.667 回答