我有一个MySQL member
表,其中DOB
字段以DATE
格式存储所有成员的出生日期(注意:它有“年”部分)
我正在尝试找到正确的SQL:
和另一个查询:
通过以下方式直接比较当前日期:
(DATEDIFF(DOB, now()) <= 14 and DATEDIFF(DOB, now()) >= 0)
从今年起不会取任何东西,而且DOB年份也不同。
然而,将DOB转换为'今年'根本不会起作用,因为今天可能是1月1日,候选人可能有12月31日的DOB(反之亦然)
如果你能伸出援助之手将会很棒,非常感谢! :)
答案 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)
检查生日(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);
当期间捕获当前和下一年或当前和上一年时,看起来工作正常