在sql中计算出生日期的年龄

时间:2014-11-02 09:51:34

标签: sql oracle date-arithmetic

我正在使用oracle执行sql查询。我需要从出生日期算出年龄。

select 
    sname,
    TIMESTAMPDIFF(YEAR, DATEOFBIRTH, CURDATE()) 
from 
    sailors 
where 
    (select 
         MAX(TIMESTAMPDIFF(YEAR, DATEOFBIRTH, CURDATE())) 
     FROM sailors) TIMESTAMPDIFF(YEAR, DATEOFBIRTH, CURDATE())

其中dateofbirth是我的列名,sailors是表名。但是,它显示错误,缺少关键字。

6 个答案:

答案 0 :(得分:0)

Ther where子句用于提供条件,并且您在那里有一个select语句。这就是你得到错误的原因。

如果您只需要出生日期差异,请使用

SELECT sname,(DATEOFBIRTH - sysdate) AS "Days"
FROM sailors

这应该足够了

答案 1 :(得分:0)

在Oracle中提供具有最大年龄的行:

select sname, age from (
  select sname, extract(year from current_date) - extract (year from dateofbirth) age,
         row_number() over(order by extract(year from current_date) - extract (year from dateofbirth) desc) rw
  from sailors
) where rw = 1;

extract(year from current_date) - extract (year from dateofbirth)日期之间的差异

row_number() over(order by age desc) - 根据ORDER BY

计算行数

答案 2 :(得分:0)

通常年龄是年龄。因此,months_between()给出两个日期之间的整月数;除以12得出年数;并应用floor()删除不需要的部分。

select sname
        , floor(months_between(sysdate, dateofbirth)/12) as age_in_yrs
from sailors
/

如果您想获得最老的水手,那么您可以将其部署为子查询:

with cte as ( select sname
                  , floor(months_between(sysdate, dateofbirth)/12) as age_in_yrs
              from sailors )
select *
from cte
where age_in_yrs = ( select max(age_in_yrs) from cte )
/

Oracle拥有丰富的日期时间函数,由于历史原因,这些函数的名称通常与其他RDBMS中的等价函数不同。 Find out more


  

'它显示"不是有效的月份"。'

只有在将字符串转换为日期时才会发生这种情况。所以可能你的DATEOFBIRTH列没有DATE数据类型。并且其中的字符串与默认的NLS_DATE_FORMAT不匹配。如果默认日期格式为12.23.1993

,则ORA-01843这样的字符串会抛出dd.mm.yyyy

所以你需要编写一个显式的强制转换,因此:

select sname
        , floor(months_between(sysdate, to_date(dateofbirth, 'dd.mm.yyyy'))/12) as age_in_yrs
from sailors
/

请注意,我必须猜测您的日期是DD.MM还是MM.DD,因为您提供的示例并不明显;根据需要调整面膜。

答案 3 :(得分:0)

select sname, extract(year from sysdate) - extract (year from dateofbirth ) age
from sailors 

--or 

select to_number(to_char(sysdate,'yyyy') - to_number(to_char( dateofbirth ,'yyyy')) 
from sailors  

答案 4 :(得分:0)

这是一个可以计算人的年龄的T-SQL。准确到出生那天。

select case 
            when cast(getdate() as date) = cast(dateadd(year, (datediff(year, '1996-09-09', getdate())), '1996-09-09') as date)
                then dateDiff(yyyy,'1996-09-09',dateadd(year, 0, getdate()))
            else dateDiff(yyyy,'1996-09-09',dateadd(year, -1, getdate()))
        end as MemberAge
go

答案 5 :(得分:0)

更多关于sql age计算的信息,如APC所指出的,可以通过以下表达式给出整数年龄:

separatorView

但是,heightForRowAt函数特别对待月末。这可能会给跳投运动员(2月29日出生的人)带来麻烦,摘自Wikipedia: The effective legal date of a leapling's birthday in non-leap years varies between jurisdictions.

举一个例子,在1998年2月28日,是某人在1988年2月29日出生,当时10岁或9岁?以前的表达式将产生10,但在某些区域为9。

在Teradata中,该表达式似乎通常用于在3月1日(而不是2月28日)允许跳高运动员只满一岁的年龄,而不是2月28日:

floor(months_between(sysdate, dateofbirth)/12)

我认为此表达式应该具有相同的效果,无需调用months_between

select (extract(year from current_date) - extract(year from BIRTH_DATE) (named YEARS))
+ case when current_date - (YEARS (interval year)) < BIRTH_DATE
then -1 else 0 end

我运行了以下代码以检查Teradata中此表达式的有效性:

case when