我正在尝试编写一个存储过程来选择即将到来的生日的员工.
SELECT * FROM Employees WHERE Birthday > @Today AND Birthday < @Today + @NumDays
这不起作用,因为出生年份是生日的一部分,所以如果我的生日是'09 -18-1983',那将不会介于'09 -18-2008'和'09 -25-2008'之间.
有没有办法忽略日期字段的年份部分,只是比较月/日?
这将在每个星期一早上运行,提醒管理人员即将到来的生日,因此可能会跨越新的一年.
这是我最终创建的工作解决方案,感谢Kogus.
SELECT * FROM Employees WHERE Cast(DATEDIFF(dd, birthdt, getDate()) / 365.25 as int) - Cast(DATEDIFF(dd, birthdt, futureDate) / 365.25 as int) <> 0
JosephStyons.. 33
注意:我编辑了这个来修复我认为是一个重要的错误.目前发布的版本适合我.
修改字段和表名以与数据库对应后,这应该有效.
SELECT BRTHDATE AS BIRTHDAY ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25) AS AGE_NOW ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25) AS AGE_ONE_WEEK_FROM_NOW FROM "Database name".dbo.EMPLOYEES EMP WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25)) - (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25))
基本上,它从他们的生日到现在获得了#天数,并将其除以365(以避免在您直接转换为年份时出现的舍入问题).
然后它从他们的生日到现在的一周内获得#天,并将其除以365,以便从现在起一周内获得他们的年龄.
如果他们的生日在一周内,那么这两个值之间的差异将为1.因此它返回所有这些记录.
注意:我编辑了这个来修复我认为是一个重要的错误.目前发布的版本适合我.
修改字段和表名以与数据库对应后,这应该有效.
SELECT BRTHDATE AS BIRTHDAY ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25) AS AGE_NOW ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25) AS AGE_ONE_WEEK_FROM_NOW FROM "Database name".dbo.EMPLOYEES EMP WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25)) - (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25))
基本上,它从他们的生日到现在获得了#天数,并将其除以365(以避免在您直接转换为年份时出现的舍入问题).
然后它从他们的生日到现在的一周内获得#天,并将其除以365,以便从现在起一周内获得他们的年龄.
如果他们的生日在一周内,那么这两个值之间的差异将为1.因此它返回所有这些记录.
如果有人仍在寻找MySQL的解决方案(略有不同的命令),这里是查询:
SELECT name,birthday, FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25) AS age_now, FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25) AS age_future FROM user WHERE 1 = (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25)) - (FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25)) ORDER BY MONTH(birthday),DAY(birthday)
最好使用datediff和dateadd.没有舍入,没有近似,没有2月29日的bug,只有日期功能
ageOfThePerson = DATEDIFF(yyyy,dateOfBirth, GETDATE())
dateOfNextBirthday = DATEADD(yyyy,ageOfThePerson + 1, dateOfBirth)
daysBeforeBirthday = DATEDIFF(d,GETDATE(), dateofNextBirthday)
感谢@Gustavo Cardoso,这个人年龄的新定义
ageOfThePerson = FLOOR(DATEDIFF(d,dateOfBirth, GETDATE())/365.25)