Mysql Dayofyear在闰年

san*_*ers 3 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)
Run Code Online (Sandbox Code Playgroud)

因此,在这个查询中,出生在闰年的人的出生日期在非闰年中有不同的一年.

如何调整查询以确保它在闰年中也能正常工作?

我拥有的mysql版本是:5.0.67

Mar*_*ams 8

NOW()非闰年在哪里2011,问题出现在2月29日之后闰年出生的任何人因为你DAYOFYEAR在出生年份使用而有额外的一天.

DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Run Code Online (Sandbox Code Playgroud)

如果你这样做DAYOFYEAR,你需要从当年开始,而不是出生年份.

所以,而不是:

DAYOFYEAR(e.birthdate)
Run Code Online (Sandbox Code Playgroud)

你可以像这样把它转换成今年:

DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Run Code Online (Sandbox Code Playgroud)

哪个转换出生日期:

'2004-04-01'
Run Code Online (Sandbox Code Playgroud)

至:

'2011-04-01'
Run Code Online (Sandbox Code Playgroud)

所以,这是修改后的查询:

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))
Run Code Online (Sandbox Code Playgroud)

2月29日出生的人将在3月1日的非闰年落下,这仍然是一天60.