如何将Genericattribute表中int类型出生日期转日期并判断今日生日
解决方案:int转日期+今日生日查询与触发器实现
1. 把int类型出生日期转为Date类型
假设value字段是yyyymmdd格式的整数(比如19951001代表1995年10月1日),用以下转换逻辑:
SELECT [id], -- 先转成字符串,再转成Date类型 CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112) AS birth_date FROM [Genericattribute] WHERE [key] = 'DateOfBirth'
112是SQL Server中对应
yyyymmdd格式的转换码,能确保转换精准。如果你的int是其他格式(比如mmddyyyy或时间戳),需要调整转换方式。
2. 查询今日过生日的员工
只需要对比出生日期的月份和日期,不用考虑年份:
高效写法(推荐)
SELECT [id], CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112) AS birth_date FROM [Genericattribute] WHERE [key] = 'DateOfBirth' AND MONTH(CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112)) = MONTH(GETDATE()) AND DAY(CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112)) = DAY(GETDATE())
简洁写法
SELECT [id], CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112) AS birth_date FROM [Genericattribute] WHERE [key] = 'DateOfBirth' AND FORMAT(CONVERT(DATE, CAST([value] AS VARCHAR(8)), 112), 'MMdd') = FORMAT(GETDATE(), 'MMdd')
3. 创建生日检查触发器(可选)
如果需要在员工生日数据新增/修改时即时检查,或者每日自动执行检查,可参考以下实现:
新增/修改时触发的触发器
CREATE TRIGGER trg_CheckBirthday ON [Genericattribute] AFTER INSERT, UPDATE AS BEGIN SET NOCOUNT ON; -- 输出今日过生日的新增/修改员工 SELECT i.[id], CONVERT(DATE, CAST(i.[value] AS VARCHAR(8)), 112) AS birth_date FROM inserted i WHERE i.[key] = 'DateOfBirth' AND MONTH(CONVERT(DATE, CAST(i.[value] AS VARCHAR(8)), 112)) = MONTH(GETDATE()) AND DAY(CONVERT(DATE, CAST(i.[value] AS VARCHAR(8)), 112)) = DAY(GETDATE()); END
若需要触发业务动作(比如发送生日提醒),可在触发器内添加对应逻辑。如果需要每日批量检查,建议创建SQL Server代理作业定时执行上述查询。
内容的提问来源于stack exchange,提问作者CK Vignesh
相关产品推荐
相关产品推荐

