Където NOW()
е невисокосна година 2011
, проблемът възниква от това, че всеки, роден през високосна година след 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))
Хората, родени на 29 февруари, ще паднат на 1 март в невисокосни години, което все още е ден 60
.