以自然顺序提取生日

Seb*_*opa 3 mysql sql

鉴于以下mysql表:

ID|name|year|month|day
----------------------
1 |john|1978|5|1  
2 |mike|1979|7|23  
3 |bob |1985|2|14  
4 |joe |1964|2|16  
5 |jane|1975|9|22
Run Code Online (Sandbox Code Playgroud)

我试图按照他们的生日事件,即将到来的生日顺序提取用户.因此,如果查询在9月16日执行,则顺序应为:jane,bob,joe,john,mike.

Qua*_*noi 8

SELECT  u.*, CAST(CONCAT_WS('.', YEAR(SYSDATE()) + (CAST(CONCAT_WS('.', YEAR(SYSDATE()), month, day) AS DATE) < SYSDATE()), month, day) AS DATE) AS nbd
FROM    t_users u
ORDER BY
        nbd;
Run Code Online (Sandbox Code Playgroud)

ORDER BY表达式采用当年的生日为当前日期比较的布尔结果并将其添加到当前的年份.

这导致下一个生日(表示为DATE),可以在其上订购该语句.

作为奖励,您可以轻松获得下一个生日:

5, 'jane',  1975, 9, 22, '2009-09-22'
3, 'bob',   1985, 2, 14, '2010-02-14'
4, 'joe',   1964, 2, 16, '2010-02-16'
1, 'john',  1978, 5, 1,  '2010-05-01'
2, 'mike',  1979, 7, 23, '2010-07-23'
Run Code Online (Sandbox Code Playgroud)

更新:

此查询可以更好地处理闰年.

SELECT  u.*, CAST(CONCAT_WS('.', year, month, day) AS DATE),
        CAST(CONCAT_WS('.', 1980, month, day) AS DATE) + INTERVAL YEAR(SYSDATE()) - 1980 YEAR +
        INTERVAL CAST(CONCAT_WS('.', 1980, month, day) AS DATE) + INTERVAL YEAR(SYSDATE()) - 1980 YEAR < SYSDATE() YEAR AS nbd
FROM    t_users u
ORDER BY
        nbd;
Run Code Online (Sandbox Code Playgroud)

它假定出生的人的非闰年生日Feb 29Feb 28.

我添加了一个Alex出生于Feb 29, 1980以下名字的人:

5, 'jane', 1975, 9, 22, '1975-09-22', '2009-09-22'
3, 'bob',  1985, 2, 14, '1985-02-14', '2010-02-14'
4, 'joe',  1964, 2, 16, '1964-02-16', '2010-02-16'
6, 'alex', 1980, 2, 29, '1980-02-29', '2010-02-28'
1, 'john', 1978, 5, 1,  '1978-05-01', '2010-05-01'
2, 'mike', 1979, 7, 23, '1979-07-23', '2010-07-23'
Run Code Online (Sandbox Code Playgroud)