微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql生日提醒,闰年

我正在尝试整理一个结果集,该结果集给出了按即将到来的生日排序的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',('1988-09-20',('2000-01-02',('2000-01-03',1),('1988-09-19',('1988-09-18',('1992-02-29',('1993-03-01',0);

请注意,假设在闰日出生的人在非闰年有2月28日的生日.

此外,您的查询包括用户用户ID.你可能想要添加它,我想.

原文地址:https://www.jb51.cc/mysql/433705.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐