即将到来的生日年虫(SQL)

时间:2011-06-23 12:25:37

标签: mysql sql

这是我当前的SQL查询,可以在接下来的90天内获得我公司即将到来的所有生日:

 SELECT
   user.birthday, user.name, MONTH(user.birthday)
   AS month, DAY(user.birthday) AS day
 FROM user WHERE
   (1 =
   (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL
   90 DAY),birthday) / 365.25)) -
   (FLOOR(DATEDIFF(DATE(NOW()),birthday)
   / 365.25))) 
 ORDER BY MONTH(birthday),DAY(birthday)

问题是,如果现在是11月,并且在1月份有一些生日,它将首先显示1月1日生日,然后是11月和12月,尽管1月份已经发生了1月生日。

有没有办法在同一个SQL查询中重新排序这些记录,以便它首先显示当前和未来的月份,然后是明年的月份?

第一部分解决方案感谢Johan

ORDER BY ( MONTH(birthday) > MONTH(NOW()             
        OR ((MONTH(birthday) = MONTH(now()) 
            AND DAY(birthday) >= DAY(NOW()) DESC
   , MONTH(birthday), DAY(birthday) 

还需要一点改进。如果生日已经发生,应该在12月之后显示结果。假设它是6月27日应该显示什么的示例

  • 6月28日:john doe
  • 12月27日:mary wright
  • 5月5日(当然是明年):mad max

5 个答案:

答案 0 :(得分:1)

我相信你需要使用包含年份的东西订购。

ORDER by date_format( date, "%d/%m/%Y" )

我不是专家,但这样的事情也可能有用。

ORDER BY YEAR(birthday),MONTH(birthday),DAY(birthday)

答案 1 :(得分:1)

我不确定,但是你的生日似乎包含了这一年。如果是这样的话,那么每个用户就有一个生日范围(每年一个),你可以在接下来的90天内选择那些生日。

SELECT
  user.birthday
  , user.name
  , MONTH(user.birthday) AS month
  , DAY(user.birthday) AS day  
FROM user 
WHERE  birthday BETWEEN NOW() AND DATE_ADD(NOW, INTERVAL 90 DAY)  
ORDER BY Birthday DESC

如果您的生日只有一个月和一天,则您的查询必须是:

SELECT
  user.birthday
  , user.name
  , MONTH(user.birthday) AS month
  , DAY(user.birthday) AS day  
FROM user 
WHERE STR_TO_DATE(CONCAT(YEAR(NOW()),MONTH(birthday),DAY(birthday)),'%YYYY%M%D')
  BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY) OR
STR_TO_DATE(CONCAT(YEAR(DATE_ADD(NOW(),INTERVAL 1 YEAR)),MONTH(birthday),DAY(birthday)),'%YYYY%M%D')
  BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY) 
ORDER BY ( MONTH(birthday) > MONTH(NOW() 
           OR ((MONTH(birthday) = MONTH(now()) AND DAY(birthday) >= DAY(NOW()) DESC,
         MONTH(birthday), DAY(birthday)

答案 2 :(得分:1)

我想您想知道每个用户的当年或下一年的生日是否介于您的范围之间:

SELECT name, birthday
  FROM (SELECT name, birthday, YEAR(NOW()) - YEAR(birthday) AS years_ago
          FROM user) d
 WHERE DATE_ADD(birthday, INTERVAL years_ago YEAR)
           BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY)
       OR
       DATE_ADD(birthday, INTERVAL (years_ago + 1) YEAR)
           BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY);

(我觉得你可能真的想要INTERVAL 3 MONTH,而不是90 DAY,特别是如果你打算在每个月的第一天运行这个查询。)

答案 3 :(得分:0)

您的查询将创建一个完整的表扫描。

存储一个包含一年中某一天的整数(4月1日将大约为90),并将其与当年的当天比较。

答案 4 :(得分:0)

我一直在寻找这个代码,但我找不到干净/简单的查询(也适用于闰年(2月29日问题))

所以我自己做了。

以下是获取接下来x天即将到来的生日的最简单代码(此查询还会显示昨天的生日(或者您可以将其更改为过去的x天数)

SELECT name, date_of_birty 
FROM users 
WHERE DATE(CONCAT(YEAR(CURDATE()), RIGHT(date_of_birty, 6)))
        BETWEEN 
            DATE_SUB(CURDATE(), INTERVAL 1 DAY)
        AND
            DATE_ADD(CURDATE(), INTERVAL 5 DAY)