gpt4 book ai didi

mysql生日提醒,闰年

转载 作者:可可西里 更新时间:2023-11-01 06:59:19 27 4
gpt4 key购买 nike

我正在尝试整理一个结果集,该结果集提供按即将到来的生日排序的 5 个最接近的用户。在闰年开始发挥作用之前,这非常有效。例如:

  • 5 月 15 日 - 还剩 96 天
  • 5 月 15 日 - 还剩 97 天

最高的结果是 1987 年的出生,较低的是 1988 年的出生。u_birth 存储为 yyyy-mm-dd。有没有一种简单的方法可以解决这个问题而不必重写整个查询?

SELECT u_birth, IF( DAYOFYEAR( u_birth ) >= DAYOFYEAR( NOW() ), 
DAYOFYEAR( u_birth ) - DAYOFYEAR( NOW() ),
DAYOFYEAR( u_birth ) - DAYOFYEAR( NOW() ) +
DAYOFYEAR( CONCAT( YEAR( NOW() ), '-12-31' ) )
)
AS distance
FROM (blog_users)
WHERE `s_agehide` = 0
ORDER BY distance ASC
LIMIT 5

此查询是从 mysql 手册中获取和修改的:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#c7489

最佳答案

如果您的算法取决于此人的出生年份,则显然存在问题。要解决此问题,请先找到每个人在当前日期之后的下一个生日,然后计算该日期与现在之间的差值。

SELECT u_birth, DATEDIFF(next_birthday, NOW()) AS distance FROM (
SELECT *, ADDDATE(birthday, INTERVAL birthday < DATE(NOW()) YEAR) AS next_birthday
FROM (
SELECT *, ADDDATE(u_birth, INTERVAL YEAR(NOW()) - YEAR(u_birth) YEAR) AS birthday
FROM blog_users
WHERE s_agehide = 0
) AS T1
) AS T2
ORDER BY distance ASC
LIMIT 5

结果:

'1992-02-29', 20
'1993-03-01', 21
'1987-05-15', 96
'1988-05-15', 96
'1988-09-18', 222

测试数据:

CREATE TABLE blog_users (u_birth NVARCHAR(100) NOT NULL, s_agehide INT NOT NULL);
INSERT INTO blog_users (u_birth, s_agehide) VALUES
('1987-05-15', 0),
('1988-05-15', 0),
('1988-09-20', 0),
('2000-01-02', 0),
('2000-01-03', 1),
('1988-09-19', 0),
('1988-09-18', 0),
('1992-02-29', 0),
('1993-03-01', 0);

请注意,闰日出生的人被假定为平年 2 月 28 日的生日。

此外,您的查询不包含用户的用户 ID。我想你可能也想添加这个。

关于mysql生日提醒,闰年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224404/

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