Ở đâu NOW()
là một năm không nhuận 2011
, vấn đề phát sinh do bất kỳ ai sinh vào năm nhuận sau ngày 29 tháng 2 sẽ có thêm một ngày vì bạn đang sử dụng DAYOFYEAR
so với năm sinh.
DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91
Nơi bạn làm DAYOFYEAR
, bạn cần ngày sinh của năm hiện tại, không phải năm sinh.
Vì vậy, thay vì:
DAYOFYEAR(e.birthdate)
Bạn có thể chuyển đổi nó sang năm nay như thế này:
DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))
Chuyển đổi ngày sinh của:
'2004-04-01'
Tới:
'2011-04-01'
Vì vậy, đây là truy vấn đã sửa đổi:
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))
Những người sinh ngày 29 tháng 2 sẽ rơi vào ngày 1 tháng 3 vào những năm không nhuận, tức là ngày 60
.