一个很简单的SQL题“知道生日怎样求年龄”
jtcyb是表名,年龄、生日是列名字段。我想得到年龄:年/月/天 的详细信息。比如 19-7-22 ,请教大虾们应该怎么改
四楼的说的挺好的,怎么连起来啊?年”= datediff(yy,生日,getdate()) -1
“月”= datediff(mm,dateadd( yy, datediff(yy,生日,getdate()) -1,生日),getdate()) -1
好像会出现 14(年)15(月)这种情况。偶是小菜鸟,踩学了一周的SQL,麻烦写得再详细点,运行OK的话,马上结账 展开
不过思路其实很简单:
上次提供给你的写法的确是有点问题。请看下面的解释:
相隔年数:生日与现在对比很容易计算得到,要注意,如果出生日期比现在迟则需要减1,因为你计算的是周岁;
月数:( 生日 + 相隔年数 )与现在对比得到,同样,如果生日日期比现在迟则需要减1;
日数:( 生日 + 相隔年数 + 月数)与现在对比得到,如果今天不算,那么减1,如果今天算,那么不减。
具体就是:
“年”=
select
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end
“月”=
select
case
when datepart( day, 生日) > datepart( day, getdate() ) then
datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate()) -1
else datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate())
end
“日”=
select datediff(day, dateadd( mm, case
when datepart( day, 生日) > datepart( day, getdate() ) then
datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate()) -1
else datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate())
end, dateadd( yy, case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,生日)),getdate())
把年月日连接起来,就是:
select
convert( varchar,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end)
+' 年 '+
convert( varchar,
case
when datepart( day, 生日) > datepart( day, getdate() ) then
datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate()) -1
else datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate())
end
)
+' 月 '+
convert( varchar,
datediff(day, dateadd( mm, case
when datepart( day, 生日) > datepart( day, getdate() ) then
datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate()) -1
else datediff(mm,dateadd( yy,
case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,
生日
),
getdate())
end, dateadd( yy, case
when datepart( dy, 生日) > datepart( dy, getdate() ) then datediff( yy,生日,getdate()) -1
else datediff( yy,生日,getdate())
end,生日)),getdate())
) + ' 日 '
像这种问题,一般不会在SQL中来做的,因为相对来说太复杂了。一般会在前台程序代码里实现,不过既然你提出这个问题来了,我就研究了几个小时,算是对新人的支持,呵呵。
select datediff(year,生日,getdate()) as 年龄,convert(varchar,生日,120) as 生日 from jtcyb
dateadd(year,datediff(year,生日,getdate()),生日)
date:类型tdatetime;值:'2008/01/21'
select convert(nvarchar,date,1) from table
返回格式:01/21/08
select convert(nvarchar,date,2) from table
返回格式:08.01.21
select convert(nvarchar,date,3) from table
返回格式:21/01/08
select convert(nvarchar,date,4) from table
返回格式:21.01.08
select convert(nvarchar,date,5) from table
返回格式:21-01-08
select convert(nvarchar,date,6) from table
返回格式:21 01 08
select convert(nvarchar,date,7) from table
返回格式:01 21, 08
select convert(nvarchar,date,8) from table
返回格式:00:00:00
select convert(nvarchar,date,9) from table
返回格式:01 21 2008 12:00:00:000AM
select convert(nvarchar,date,10) from table
返回格式:01-21-08
select convert(nvarchar,date,11) from table
返回格式:08/01/21
select convert(nvarchar,date,12) from table
返回格式:080121
select convert(nvarchar,date,13) from table
返回格式:21 01 2008 00:00:00:000
select convert(nvarchar,date,14) from table
返回格式:00:00:00:000
你应该用上边的最后一个参数为11的。