sql >> Base de Datos >  >> RDS >> Mysql

Mysql Dayofyear en año bisiesto

Donde NOW() es un año no bisiesto 2011 , el problema surge porque cualquier persona nacida en un año bisiesto después del 29 de febrero tendrá un día adicional porque está usando DAYOFYEAR contra el año de nacimiento.

DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91

Donde haces DAYOFYEAR , necesita la fecha de nacimiento del año actual, no el año de nacimiento.

Entonces, en lugar de:

DAYOFYEAR(e.birthdate)

Puedes convertirlo a este año así:

DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))

Que convierte una fecha de nacimiento de:

'2004-04-01'

Para:

'2011-04-01'

Entonces, aquí está la 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))

Las personas nacidas el 29 de febrero caerán el 1 de marzo en años no bisiestos, que todavía es el día 60 .