gpt4 book ai didi

sql - 按自然顺序提取生日

转载 作者:可可西里 更新时间:2023-11-01 07:48:37 24 4
gpt4 key购买 nike

给定以下 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

我正在尝试按照生日事件的顺序提取用户,即将到来的生日排在第一位。因此,如果查询在 9 月 16 日执行,则顺序应为:jane、bob、joe、john、mike。

最佳答案

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;

ORDER BY 表达式获取当前年份生日与当前日期的比较 bool 结果,并将其添加到当前年份。

这会导致下一个生日(表示为 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'

更新:

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

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;

假设 Feb 29 出生的人的非闰年生日是 Feb 28

我添加了一个名叫 Alex 的人,他出生于 1980 年 2 月 29 日:

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'

关于sql - 按自然顺序提取生日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1433821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com