I have the following table of people and their birthdays:
name birthday
----------------------
yannis 1979-06-29
natalia 1980-08-19
kostas 1983-10-27
christos 1979-07-22
kosmas 1978-04-28
and I have no idea how to sort the names on how closer the birthday is to today. So for NOW() = 2011-09-08 the sorted result should be:
kostas 1983-10-27
kosmas 1978-04-28
yannis 1979-06-29
christos 1979-07-22
natalia 1980-08-19
I'm looking for a quick hack, don't really care for performance (pet project - table will hold less than 1000 records), but of course every suggestion will be extremely appreciated.
Here is one way:
SELECT
name,
birthday,
birthday + INTERVAL (YEAR(CURRENT_DATE) - YEAR(birthday)) YEAR AS currbirthday,
birthday + INTERVAL (YEAR(CURRENT_DATE) - YEAR(birthday)) + 1 YEAR AS nextbirthday
FROM birthdays
ORDER BY CASE
WHEN currbirthday >= CURRENT_DATE THEN currbirthday
ELSE nextbirthday
END
Notes:
SQLFiddle
SELECT name
, birthday
FROM TableX
ORDER BY DAYOFYEAR(birthday) < DAYOFYEAR(CURDATE())
, DAYOFYEAR(birthday)
No, the above may produce error results, due to years with 366 days. This is correct:
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
If your table grows to more than a few thousands records, it will be real slow. If you want a fast query, add fields with the month and day and have an index on (bmonth,bday)
or add them as one field, either Char (08-17
or 0817
for 17-Aug) or Int (817
for 17-Aug) and an index on that field.
Seems to be rather fast, no problems with leap years:
SELECT *
FROM `people`
ORDER BY CONCAT(SUBSTR(`birthday`,6) < SUBSTR(CURDATE(),6), SUBSTR(`birthday`,6))
Все гениальное -- просто! ;)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With