我正在尝试整理一个结果集,该结果集给出了按即将到来的生日排序的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 distanceFROM (blog_users)WHERE `s_agehIDe` = 0ORDER BY distance ASCliMIT 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 T2ORDER BY distance ASCliMIT 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.你可能想要添加它,我想.
总结以上是内存溢出为你收集整理的mysql生日提醒,闰年全部内容,希望文章能够帮你解决mysql生日提醒,闰年所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)