一个很简单的SQL题“知道生日怎样求年龄”

updatejtcybset年龄=datediff(year,生日,getdate())jtcyb是表名,年龄、生日是列名字段。我想得到年龄:年/月/天的详细信息。比如1... update jtcyb set 年龄=datediff(year,生日,getdate())
jtcyb是表名,年龄、生日是列名字段。我想得到年龄:年/月/天 的详细信息。比如 19-7-22 ,请教大虾们应该怎么改
四楼的说的挺好的,怎么连起来啊?年”= datediff(yy,生日,getdate()) -1
“月”= datediff(mm,dateadd( yy, datediff(yy,生日,getdate()) -1,生日),getdate()) -1
好像会出现 14(年)15(月)这种情况。偶是小菜鸟,踩学了一周的SQL,麻烦写得再详细点,运行OK的话,马上结账
展开
 我来答
gulingeagle
推荐于2016-12-01 · TA获得超过545个赞
知道小有建树答主
回答量:315
采纳率:100%
帮助的人:368万
展开全部
这个功能如果在SQL里做,不是一个很简单的SQL题了。

不过思路其实很简单:
上次提供给你的写法的确是有点问题。请看下面的解释:
相隔年数:生日与现在对比很容易计算得到,要注意,如果出生日期比现在迟则需要减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中来做的,因为相对来说太复杂了。一般会在前台程序代码里实现,不过既然你提出这个问题来了,我就研究了几个小时,算是对新人的支持,呵呵。
百度网友2db262e5f
2009-03-11 · TA获得超过1496个赞
知道大有可为答主
回答量:1814
采纳率:0%
帮助的人:1446万
展开全部
如果生日字段是日期型的:
select datediff(year,生日,getdate()) as 年龄,convert(varchar,生日,120) as 生日 from jtcyb
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shutao917
2009-03-10 · TA获得超过1213个赞
知道大有可为答主
回答量:2199
采纳率:0%
帮助的人:3144万
展开全部
update jtcyb set 年龄=
dateadd(year,datediff(year,生日,getdate()),生日)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lzp4881
2009-03-10 · TA获得超过2394个赞
知道大有可为答主
回答量:2825
采纳率:0%
帮助的人:3015万
展开全部
update jtcyb set 年龄=datediff('y',生日,getdate())
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
熊冰昳5B
2009-03-11 · TA获得超过490个赞
知道小有建树答主
回答量:632
采纳率:0%
帮助的人:467万
展开全部

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的。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式