You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写单条SQL语句查询未来60天内的生日人员列表

跨年度生日查询的SQL解决方案

针对年末查询未来60天生日时,因跨年度导致日期字符串比较失效的问题,可通过构造当年或下一年的实际庆祝日期来实现准确查询,以下是两种可行的单条SQL实现方式:

方法一:构造实际庆祝日期(推荐,兼容闰年)

通过判断生日的当年日期是否已过,自动切换到下一年的日期,再筛选并排序:

SELECT 
    name,
    dateofbirth
FROM friends
WHERE 
    -- 计算当前或下一年的生日日期,判断是否在未来60天内
    CASE
        -- 如果今年的生日已经过了,就用下一年的日期
        WHEN STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') < NOW()
        THEN STR_TO_DATE(CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d')
        -- 否则用今年的生日日期
        ELSE STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d')
    END BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 60 DAY)
ORDER BY 
    -- 按实际庆祝日期排序
    CASE
        WHEN STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d') < NOW()
        THEN STR_TO_DATE(CONCAT(YEAR(NOW()) + 1, '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d')
        ELSE STR_TO_DATE(CONCAT(YEAR(NOW()), '-', DATE_FORMAT(dateofbirth, '%m-%d')), '%Y-%m-%d')
    END;

方法二:利用年积日(DAYOFYEAR)比较

通过年积日(一年中的第几天)进行判断,跨年度时给下一年的生日年积日加365:

SELECT 
    name,
    dateofbirth
FROM friends
WHERE 
    -- 情况1:生日在今年剩余的60天内
    (DAYOFYEAR(NOW()) <= DAYOFYEAR(dateofbirth) 
     AND DAYOFYEAR(dateofbirth) <= DAYOFYEAR(DATE_ADD(NOW(), INTERVAL 60 DAY)))
    OR
    -- 情况2:生日在明年年初的60天范围内(跨年度)
    (DAYOFYEAR(NOW()) > DAYOFYEAR(dateofbirth)
     AND DAYOFYEAR(dateofbirth) + 365 <= DAYOFYEAR(DATE_ADD(NOW(), INTERVAL 60 DAY)) + 365)
ORDER BY 
    -- 按年积日排序,跨年度的生日加365保证顺序正确
    CASE 
        WHEN DAYOFYEAR(dateofbirth) >= DAYOFYEAR(NOW()) 
        THEN DAYOFYEAR(dateofbirth) 
        ELSE DAYOFYEAR(dateofbirth) + 365 
    END;

结果验证

当在2022年12月2日执行查询时,两种方法都会返回符合要求的结果:

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

内容的提问来源于stack exchange,提问作者Kladizkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:20:28