Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql Dayofyear em ano bissexto


Onde NOW() é um ano não bissexto 2011 , o problema surge de qualquer pessoa nascida em um ano bissexto após 29 de fevereiro terá um dia extra porque você está usando DAYOFYEAR contra o ano de nascimento.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91

Onde você faz DAYOFYEAR , você precisa da data de nascimento do ano atual, não do ano de nascimento.

Assim, em vez de:
DAYOFYEAR(e.birthdate)

Você pode convertê-lo para este ano assim:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))

Que converte uma data de nascimento de:
'2004-04-01'

Para:
'2011-04-01'

Então, aqui está a consulta modificada:
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))

As pessoas nascidas em 29 de fevereiro cairão em 1º de março em anos não bissextos, que ainda é o dia 60 .