当前位置:  开发笔记 > 后端 > 正文

SQL选择即将到来的生日

如何解决《SQL选择即将到来的生日》经验,为你挑选了3个好方法。

我正在尝试编写一个存储过程来选择即将到来的生日的员工.

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.因此它返回所有这些记录.



1> JosephStyons..:

注意:我编辑了这个来修复我认为是一个重要的错误.目前发布的版本适合我.

修改字段和表名以与数据库对应后,这应该有效.

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.因此它返回所有这些记录.


我不确定如何编辑你的答案,但不是除以365,你需要除以365.25,然后转换为int.闰年,再次搞砸了一切.
谢谢,你是对的,我也有另一个bug.编辑其他人的帖子的能力具有一定的声誉分数.查看此链接:http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq
从下面找到了一个更近期的答案我更喜欢,我想分享:SELECT*FROM User WHERE(DATEDIFF(dd,getdate(),DATEADD(yyyy,DATEDIFF(yyyy,birthdate,getdate()),birthdate))+ 365)%365 <= <天数>

2> Andres SK..:

如果有人仍在寻找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)



3> Philippe Gro..:

最好使用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)

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有