我正在使用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
是表名。但是,它显示错误,缺少关键字。
答案 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