SQL Server如何通过简单UPDATE语句根据生日计算更新年龄字段值
问题说明
- 现有数据表包含
birthday、age两个字段,age字段当前值为空 - 需要通过
UPDATE语句,根据birthday存储的生日值计算并填充正确的年龄 - 测试表结构与初始数据:
create table ex( birthday nvarchar(50), age int ) insert into ex values ('02-04-1962',null) select * from ex -- 待补全更新逻辑 --update ex set age = ....
实现方案
当前环境为SQL Server,且birthday字段以日-月-年的字符串格式存储日期,计算年龄时需要先做格式转换,同时要避免「未到当年生日时年龄多算1岁」的问题。
准确更新语句
写法1(逻辑直观)
UPDATE ex SET age = DATEDIFF(YEAR, CONVERT(DATE, birthday, 103), GETDATE()) - CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, CONVERT(DATE, birthday, 103), GETDATE()), CONVERT(DATE, birthday, 103)) > GETDATE() THEN 1 ELSE 0 END;
逻辑说明:
- 用
CONVERT(DATE, birthday, 103)将dd-MM-yyyy格式的生日字符串转为标准日期类型,103是SQL Server对应此日期格式的编码 - 先计算生日年份与当前年份的差值
- 通过
CASE判断当年生日是否已过:把生日日期平移到当前年份,若平移后的日期晚于当前日期,说明今年生日未到,年龄在年份差基础上减1
写法2(简化写法)
利用月份差的整数除法自动校准年龄,代码更简洁:
UPDATE ex SET age = DATEDIFF(MONTH, CONVERT(DATE, birthday, 103), GETDATE()) / 12;
执行后查询表数据,示例中1962年4月2日出生的记录,会根据当前日期自动算出正确年龄。
注意:如果后续birthday字段的存储格式发生变化,需要对应调整CONVERT函数的格式编码,避免日期转换报错。
内容的提问来源于stack exchange,提问作者KeusT
相关产品推荐
相关产品推荐

