SQL,列出下一个和前14天内的所有生日

时间:2009-06-09 15:04:22

标签: sql mysql date

我有一个MySQL member表,其中DOB字段以DATE格式存储所有成员的出生日期(注意:它有“年”部分)

我正在尝试找到正确的SQL:

  • 列出未来14天内的所有生日

和另一个查询:

  • 列出过去14天内的所有生日

通过以下方式直接比较当前日期:

(DATEDIFF(DOB, now()) <= 14 and DATEDIFF(DOB, now()) >= 0)

从今年起不会取任何东西,而且DOB年份也不同。

然而,将DOB转换为'今年'根本不会起作用,因为今天可能是1月1日,候选人可能有12月31日的DOB(反之亦然)

如果你能伸出援助之手将会很棒,非常感谢! :)

7 个答案:

答案 0 :(得分:3)

以下是获取接下来x天和之前x天即将到来的生日的最简单代码

此查询也不受闰年影响

SELECT name, date_of_birty 
FROM users 
WHERE DATE(CONCAT(YEAR(CURDATE()), RIGHT(date_of_birty, 6)))
          BETWEEN 
              DATE_SUB(CURDATE(), INTERVAL 14 DAY)
          AND
              DATE_ADD(CURDATE(), INTERVAL 14 DAY)

答案 1 :(得分:2)

@Eli有一个很好的回应,但硬编码351使它有点混乱,并在闰年下降1。

检查生日(dob)是否在接下来的14天内。首先检查是否在同一年。第二次检查是否是12月27日,你也想要包括Jan日期。

使用DAYOFYEAR( CONCAT(YEAR(NOW()),'-12-31') ),我们决定是否根据当前年份(闰年)使用365或366.

SELECT dob
FROM birthdays
WHERE DAYOFYEAR(dob) - DAYOFYEAR(NOW()) BETWEEN 0 AND 14 
OR 
DAYOFYEAR( CONCAT(YEAR(NOW()),'-12-31') ) - ( DAYOFYEAR(NOW()) - DAYOFYEAR(dob) ) BETWEEN 0 AND 14 

答案 2 :(得分:1)

简单,

我们可以通过以下代码获得更近的生日(即今年的生日):

dateadd(year,datediff(year,dob,getdate()),DOB)

在你的比较中使用它!它会起作用。

答案 3 :(得分:1)

我的第一个想法是,只使用DAYOFYEAR并采取差异很容易,但实际上在一个yeay的开始/结束附近有点诡计。但是:

WHERE 
DAYOFYEAR(NOW()) - DAYOFYEAR(dob) BETWEEN 0 AND 14 
OR DAYOFYEAR(dob) - DAYOFYEAR(NOW())  > 351

应该有效,取决于你对闰年的关注程度。一个“更好”的答案可能是从dob中提取DAY()和MONTH()并使用MAKEDATE()在当前(或潜在的过去/后续)年份中建立一个日期并与之比较。

答案 4 :(得分:0)

有很多选择,我会先尝试按当年和行年之间的年数进行转换(即加上他们的年龄)。

另一种选择是一年中的天数(但是你仍然需要担心翻转算术或模数)。

答案 5 :(得分:0)

这是我在检查前30天的查询:

select id from users where 
((TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))>=-30 
AND (TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))<=0)
OR (TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))>=(365-31)

和之后30天:

select id from users where 
((TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))>=-31 
AND (TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))<=0)
OR (TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))>=(365-30)

答案 6 :(得分:0)

我的解决方法如下:

select cm.id from users cm where 
date(concat(
year(curdate()) - (year(subdate(curdate(), 14)) < year(curdate())
and month(curdate()) < month(cm.birthday)) + (year(adddate(curdate(), 14)) > year(curdate())
and month(curdate()) > month(cm.birthday)), date_format(cm.birthday, '-%m-%d'))) between subdate(curdate(), 14)
and adddate(curdate(), 14);

当期间捕获当前和下一年或当前和上一年时,看起来工作正常