3

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

 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

4

3 回答 3

9

哪里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 日将落在 3 月 1 日,这仍然是白天60

于 2012-03-14T14:15:27.827 回答
1

平年有365天,闰年有366天。在正常年份,3 月 1 日将是一年中的第 60 天。在闰年,2 月 29 日是一年的第 60 天。MySQL的功能是一致的。

如果你真的想让它变得比它必须的更复杂,你可以在你的DAYOFYEAR(curdate())ifcurdate()大于或等于 3 月 1 日curdate()并且不在闰年中添加一天。但我不建议这样做。

于 2012-03-14T14:10:54.310 回答
1

这是一个相关的解决方案

如何使用 PHP 和 MYSQL 找到今天正在庆祝的朋友的生日 celebrating-today-using-php-and-mysq

如果我理解正确,那么您遇到的问题是,如果您的生日是 3 月 1 日,那么由于您正在寻找一年中的第(n)个第 60 天,那么您有时会得到错误的日期。

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

于 2012-03-14T14:16:28.500 回答