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

MySQL排序需求:未来日期优先,空日期介于未来与过去日期之间

调整日期排序逻辑的解决方案

首先明确你的排序优先级:

  • 第一优先级:未来日期(expiry_date > CURDATE())排在最前,内部按expiry_date升序排列(最近的未来日期在前)
  • 第二优先级:空日期(expiry_date IS NULL)排在中间,需指定内部排序规则来调整id29的位置
  • 第三优先级:过去日期(expiry_date < CURDATE())排在最后,内部按expiry_date降序排列(最近的过去日期在前)

原查询的问题在于空日期分组没有指定排序规则,数据库会按默认存储顺序返回,导致id29的位置不符合预期。以下是修改后的查询语句:

SELECT id, expiry_date, issued_date FROM document
ORDER BY
  -- 先按分组优先级排序:未来(0) → 空日期(1) → 过去(2)
  CASE
    WHEN expiry_date > CURDATE() THEN 0
    WHEN expiry_date IS NULL THEN 1
    ELSE 2
  END ASC,
  -- 未来日期按expiry_date升序
  CASE WHEN expiry_date > CURDATE() THEN expiry_date END ASC,
  -- 空日期按id排序(可替换为issued_date等字段,确保id29处于23和22之间)
  CASE WHEN expiry_date IS NULL THEN id END ASC,
  -- 过去日期按expiry_date降序
  CASE WHEN expiry_date < CURDATE() THEN expiry_date END DESC

关键修改说明:

  1. 用CASE语句明确划分三个分组的优先级,避免原语句中NULL比较的不确定性
  2. 为空日期分组添加了明确的排序字段(示例中用id ASC),你可以根据实际需求替换为issued_date或其他字段,确保id29的位置符合预期
  3. 保留了未来/过去日期的内部排序规则,符合你的原始需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:58:03