gpt4 book ai didi

MYSQL - 即将到来的 X 出生日期

转载 作者:行者123 更新时间:2023-11-30 00:06:46 25 4
gpt4 key购买 nike

我有一个包含姓名和出生日期的表格。
我想获取与下一个即将到来的生日对应的名字。 (其中 n 是整数)
使用 LIMIT 是不可能的(我不想限制行数),使用 BETWEEN 或 WHERE 子句也是不可能的,因为它不在有限的时间内。
感谢您的帮助

最佳答案

以下查询...

1) 首先对不同的 dob 进行排序(默认情况下,今天首先排序)。

2) 使用 LIMIT 选择第一个 dob函数,以及

3) 最后,选择所有拥有最早 5 个 dob 的用户。

SELECT u1.*
from USERS u1
INNER JOIN
(
SELECT DISTINCT
EXTRACT(MONTH FROM dob) dob_month,
EXTRACT(DAY FROM dob) dob_day
FROM users
ORDER BY
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN 1
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) < EXTRACT(DAY FROM CURDATE()) THEN -1
ELSE SIGN(EXTRACT(MONTH FROM dob) - EXTRACT(MONTH FROM CURDATE()))
END DESC,
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN 1
ELSE SIGN(EXTRACT(DAY FROM dob) - EXTRACT(DAY FROM CURDATE()))
END DESC,
EXTRACT(MONTH FROM dob) ASC,
EXTRACT(DAY FROM dob) ASC
LIMIT 5
) selected_dobs
ON EXTRACT(MONTH FROM u1.dob) = selected_dobs.dob_month and EXTRACT(DAY FROM u1.dob) = selected_dobs.dob_day
ORDER BY
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN 1
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) < EXTRACT(DAY FROM CURDATE()) THEN -1
ELSE SIGN(EXTRACT(MONTH FROM dob) - EXTRACT(MONTH FROM CURDATE()))
END DESC,
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN 1
ELSE SIGN(EXTRACT(DAY FROM dob) - EXTRACT(DAY FROM CURDATE()))
END DESC,
EXTRACT(MONTH FROM dob) ASC,
EXTRACT(DAY FROM dob) ASC,
username ASC;

SQL Fiddle demo

注意

没有从 SELECT 中过滤掉任何行,因为接下来的 5 个生日(部分或全部)可能发生在下一个日历年(例如,今天可能是 12 月 28 日,接下来的 5 个生日可能发生在 12 月 28 日) 29日、12月31日、1月2日、1月5日、1月6日)。

如果您希望在列表底部选择今天的生日(而不是像上面的查询那样在列表顶部选择),只需将 ORDER BY 子句中的 1 更改为 -1,如下所示

ORDER BY
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN -1
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) < EXTRACT(DAY FROM CURDATE()) THEN -1
ELSE SIGN(EXTRACT(MONTH FROM dob) - EXTRACT(MONTH FROM CURDATE()))
END DESC,
CASE
WHEN EXTRACT(MONTH FROM dob) = EXTRACT(MONTH FROM CURDATE()) AND EXTRACT(DAY FROM dob) = EXTRACT(DAY FROM CURDATE()) THEN -1
ELSE SIGN(EXTRACT(DAY FROM dob) - EXTRACT(DAY FROM CURDATE()))
END DESC,
EXTRACT(MONTH FROM dob) ASC,
EXTRACT(DAY FROM dob) ASC

关于MYSQL - 即将到来的 X 出生日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24475232/

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