在以下查询中,不考虑闰年。
SELECT e.id,
e.title,
e.birthdate
FROM employers e
WHERE DAYOFYEAR(curdate()) <= DAYOFYEAR(e.birthdate)
AND DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(e.birthdate)
因此,在这个问题中,出生在闰年的人的出生日期在非闰年中有不同的一年。
如何调整查询以确保它在闰年中也能正常工作?
我拥有的mysql版本是:5.0.67
答案 0 :(得分:8)
NOW()
是非闰年2011
,问题出现在2月29日之后的闰年出生的任何人都会有额外的一天,因为你使用DAYOFYEAR
反对出生年份。
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
您DAYOFYEAR
的所在地,您需要当年的出生日期,而不是出生年份。
所以,而不是:
DAYOFYEAR(e.birthdate)
您可以将它转换为今年:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
哪个转换生日:
'2004-04-01'
要:
'2011-04-01'
所以,这是修改后的查询:
SELECT e.id,
e.title,
e.birthdate
FROM employers e
WHERE DAYOFYEAR(curdate()) <= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))
AND DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))
2月29日出生的人将于3月1日在非闰年落下,这仍然是60
天。
答案 1 :(得分:1)
正常年份为365天,闰年为366天。在正常年份,3月1日将是一年中的第60天。在闰年,2月29日将是一年中的第60天。 MySQL功能是一致的。
如果真的想让它变得更加复杂,如果DAYOFYEAR(curdate())
大于或等于3月,您可以为curdate()
添加一天1和curdate()
不是闰年。但我不建议这样做。
答案 2 :(得分:1)
这是一个相关的解决方案
How to find the Birthday of FRIENDS Who are celebrating today using PHP and MYSQL 庆祝-今天使用的PHP和 - mysq
如果我理解正确,你遇到的问题是,如果你的生日是3月1日,因为你正在寻找一年中的第(60)天,你有时会错误的一天。
我相信上述解决方案中的查询解决了问题