【问题标题】:Sorting nearest date with MySQL使用 MySQL 对最近的日期进行排序
【发布时间】:2009-10-14 14:07:16
【问题描述】:

我有一个简单的任务列表,其中包含标题字段和截止日期字段。有些任务有截止日期,有些则没有。截止日期只是用 MySQL 日期类型存储。

但困难的部分(无论如何对我来说)是按正确的顺序对任务进行排序:

  1. 截止日期递增
  2. 其余部分(可能按 ID,但不重要)

当前查询:

SELECT * FROM tasks ORDER BY deadline ASC

deadline 字段默认为“0000-00-00”,因此此查询将按以下顺序显示任务:

  1. 没有截止日期的任务
  2. 截止日期递增

谁能指出我正确的方向,还是我需要做多个查询?

【问题讨论】:

  • 为什么不让deadline默认为null?

标签: mysql select date


【解决方案1】:
SELECT * FROM tasks
ORDER BY CASE WHEN deadline = '0000-00-00'
              THEN '9999/09/09' 
              ELSE deadline 
         END ASC

排序时,将“0000-00-00”替换为“大”日期时间值:“9999/09/09”。

【讨论】:

    【解决方案2】:

    一个明显的可能性是(在创建项目的应用程序中)如果用户没有输入截止日期,方式在未来设置一个截止日期(比如“9999-12-31”) .当然,是否可以更改该代码尚不清楚...

    【讨论】:

    • 其实字段类型日期默认为空,所以你是对的。我可以更改代码,但是通过查询来解决它不是更容易吗。
    • 可能——如果它一开始是空的,那么(正如其他人已经指出的那样)在查询中处理它是非常简单的。就此而言,如果它是 0000-00-00,您可以在查询中处理它,但我会对此更加谨慎——我几乎可以看到有人实际输入了它(如果您让他们)表示“立即”。
    【解决方案3】:

    真的是0000-00-00吗? docs 说:

    "支持的范围是 '1000-01-01' 到 '9999-12-31'。"

    我会考虑为那些没有的人在截止日期中存储 NULL。

    SELECT * FROM tasks ORDER BY ifnull(deadline, '9999-12-31') ASC
    

    【讨论】:

    • 你是对的。默认情况下它为空,但代码插入 0000-00-00,但我可以更改它。虽然字段类型不是日期时间,而是日期。
    【解决方案4】:

    在没有截止日期的情况下使用 where 隐藏您的任务:

    SELECT * FROM tasks WHERE deadline != '0000-00-00' ORDER BY deadline
    

    【讨论】:

    • 在我看来这不是有效的 SQL,MySQL 似乎也同意。
    • 哎呀,我换了位置和顺序。
    • 据我所知,他想列出所有任务,但没有截止日期的任务排在有截止日期的任务之后。
    【解决方案5】:

    您也可以尝试使用 SELECT DISCTINCT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多