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

SQLite中按月日筛选并排序指定日期后的生日数据

解决方案

核心思路

表中存储的是出生日期(均为过去年份),直接用birthdays > date('now')会因年份比较导致无结果。我们需要忽略年份,仅通过月日判断生日的下一次出现时间是否在当前日期之后,并按“今年未过的生日→明年的生日”的逻辑排序。

具体SQL语句

1. 核心查询与排序(完全匹配需求)

SELECT 
    *,
    -- 提取生日的月-日格式,用于排序和判断
    strftime('%m-%d', birthdays) AS birthday_mmdd
FROM your_table
ORDER BY
    -- 第一排序规则:将生日分为两组——今年未过的(0)、已过的(1)
    CASE 
        WHEN strftime('%m-%d', birthdays) >= strftime('%m-%d', 'now') THEN 0 
        ELSE 1 
    END,
    -- 第二排序规则:同一组内按月-日升序排列
    birthday_mmdd;

2. 可选:排除当天过生日的记录

如果需要过滤掉今天刚好过生日的条目,可添加筛选条件:

SELECT 
    *,
    strftime('%m-%d', birthdays) AS birthday_mmdd
FROM your_table
WHERE
    strftime('%m-%d', birthdays) != strftime('%m-%d', 'now')
ORDER BY
    CASE 
        WHEN strftime('%m-%d', birthdays) >= strftime('%m-%d', 'now') THEN 0 
        ELSE 1 
    END,
    birthday_mmdd;

语句说明

  • strftime('%m-%d', date):提取日期的“月-日”部分,消除年份干扰,实现统一比较。
  • CASE表达式:将生日分为两个优先级组,今年未过的生日(月-日≥当前月-日)排在前面,已过的生日(下一次在明年)排在后面。
  • 二级排序:同一组内按“月-日”升序排列,确保顺序符合日期先后逻辑(比如7月28日之后,先排8-12月的生日,再排1-7月的生日)。

示例验证

当当前日期为2024-07-28时,上述语句会输出:
Aug 27 → Nov 18 → Jan 1 → Feb 20 → Jul 16,完全匹配你期望的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:39:15