mysql 是否可以创建一条sql语句来获取在未来60天内将举行生日庆祝活动的人员列表

pinkon5k  于 2022-12-03  发布在  Mysql
关注(0)|答案(1)|浏览(144)

我有一个表,上面有一些名字和出生日期。
参考数据:

ABC, 1990-11-23
BCD, 1998-10-21
CDE, 1997-05-02
DEF, 2000-10-15
EFG, 1999-01-10
FGH, 1987-01-15
GHI, 1989-12-19
HIJ, 1986-12-09

我需要一个SQL查询,我需要得到的生日庆祝日期,将发生在未来60天内按庆祝日期排序。
这是我到目前为止使用的查询。

SELECT * 
FROM `friends` 
WHERE ( DATE_FORMAT(`dob`, '%m%d') >= DATE_FORMAT(CURDATE(), '%m%d') 
AND DATE_FORMAT(`dob`, '%m%d') <= DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 60 DAY), '%m%d') 
ORDER BY DATE_FORMAT(`dob`, '%m%d');

如果它在一月到十月期间运行,则可以正常工作。在十一月和十二月期间,条件DATE_FORMAT(dob,'%m% d')〈= DATE_FORMAT(DATE_ADD(CURDATE(),INTERVAL 60 DAY),'%m% d')不能应用。例如,结果比较将类似于1209〈0131,因此将失败。
我希望在2022年12月2日执行时得到的结果是

HIJ, 1986-12-09
GHI, 1989-12-19
EFG, 1999-01-10
FGH, 1987-01-15

如何在一个查询中完成此操作?

00jrzges

00jrzges1#

在你的问题的评论中提到的线程使用了像增加365.25天这样的东西来让这个工作。我认为这个解决方案可能更可靠。
您可以通过从出生日期中提取月份和日期,并使用STR_TO_DATE将当前年份连接到该日期来构造今年的生日。
然后,您可以使用CASE语句检查今年的生日是否已经过去,在这种情况下,您可以在该生日后添加一年,因为这将是name的下一个生日。然后,您可以检查CASE语句的结果是否为BETWEEN今天和60天后。
我使用CTE使其更清晰地阅读。DBfiddle here

WITH cte as (
  SELECT
    -- First determine this years (year of current date) birthday
    -- by constructing it from the current year, month of birth and day of birth
    STR_TO_DATE(
      CONCAT(YEAR(CURDATE()),'-', MONTH(dob), '-', DAY(dob)), 
      '%Y-%m-%d') AS this_years_birthday, 
    name, 
    dob
  FROM friends
)
SELECT cte.name, cte.dob
FROM cte
WHERE 
    -- If the birthday is still in this year
    -- Use this years' birthday
    -- else add a year to this years' birthday
    -- Then filter it to be between today and 60 days from now
    CASE WHEN this_years_birthday >= CURDATE() 
    THEN this_years_birthday 
    ELSE DATE_ADD(this_years_birthday, INTERVAL 1 YEAR) END 
    BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 60 DAY)
ORDER BY MONTH(cte.dob) DESC

| 姓名|多布|
| - -|- -|
| GHI公司|一九八九年十二月十九日|
| HIJ公司|一九八六年十二月九日|
| 无网格|1999年1月10日|
| 生长激素|1987年1月15日|

相关问题