Mysql Dayofyear在闰年

时间:2012-03-14 13:56:19

标签: mysql leap-year

在以下查询中,不考虑闰年。

 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

3 个答案:

答案 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)天,你有时会错误的一天。

我相信上述解决方案中的查询解决了问题