SELECT name
, birthday
FROM TableX
ORDER BY DAYOFYEAR(birthday) < DAYOFYEAR(CURDATE())
, DAYOFYEAR(birthday)
Нет, приведенные выше данные могут привести к ошибкам из-за лет с 366 днями.Это правильно:
SELECT name
, birthday
FROM
( SELECT name
, birthday
, MONTH(birthday) AS m
, DAY(birthday) As d
FROM TableX
) AS tmp
ORDER BY (m,d) < ( MONTH(CURDATE()), DAY(CURDATE()) )
, m
, d
Если ваша таблица увеличится до нескольких тысяч записей, это будет очень медленно.Если вам нужен быстрый запрос, добавьте поля с месяцем и днем и индексом на (bmonth,bday)
или добавьте их как одно поле: Char (08-17
или 0817
для 17 августа) или Int (817
17 августа) и указатель на это поле.