Я не проверял это, но вы могли бы сделать что-то вроде следующего:
SELECT
# check if the year is a leap year:
IF((YEAR(mydate) % 4 = 0 AND YEAR(mydate) % 100 != 0) OR YEAR(mydate) % 400 = 0,
# if so, check if the date is before or after february 29th. if that is the case, we subtract one from the value
IF(DAYOFYEAR(mydate) > DAYOFYEAR("2008-02-28"), DAYOFYEAR(mydate) - 1, DAYOFYEAR(mydate)),
# if the year isn't a leap year, just return the regular dayofyear() value
DAYOFYEAR(mydate))
FROM mytbl
Это объединит данные за 28-й и 29-й для високосных лет, но даст одинаковые смещения для дней високосных и не високосных лет для всех остальных дней. Более желательным поведением может быть простое игнорирование данных за 29 февраля, что может быть выполнено с использованием дополнительных условий. Вы также можете назначить ему специальный индекс, например 400, который не будет компенсироваться во все остальные дни.
Лучше было бы группировать по месяцам и дням месяца:
select month(date) m, day(date) d, count(*) from reviews group by m, d;
Это позволяет полностью избежать этой проблемы, но может оказаться более сложным для обработки в логике приложения. Тем не менее, я бы сказал, что это гораздо лучший способ сделать это.