【问题标题】:sql: Sorting date according to soonest datesql:根据最早日期排序日期
【发布时间】:2021-08-11 00:10:58
【问题描述】:

我在 MySQL 中有一个列名关闭日期,它以“月-日-年”的格式存储日期。我有以下数据:

2/25/2021
2/26/2021
3/10/2021
3/21/2021 <- Today's date
3/22/2021
3/25/2021
3/29/2021

我需要对其进行排序,以便即将到来的日期排在第一位:

3/21/2021 <- Today's date
3/22/2021
3/25/2021
3/29/2021
2/25/2021
2/26/2021
3/10/2021

我怎样才能做到这一点?我尝试通过升序和降序使用顺序并进行了一些研究,但无法做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • 首先将列更改为正确的date 数据类型。 (使用char/varchar,不同年份会很麻烦。计算日期差异也是如此。)
  • 您是否正在寻找位于列表顶部的 当前 日期?其他日期呢,应该如何排序?
  • 应该是,即将到来的日期应该按升序排列,而过去的日期应该出现在记录的最后,最好也按升序排列。

标签: mysql sql sorting


【解决方案1】:

由于您同时显示之前和之后的日期,您可以在查询中添加 order by 子句,例如

order by
   abs( datediff( curdate(), theDateColumn ))

因此,从 3 月 21 日起,3 月 25 日可能会显示为 4 天后,但 3 月 20 日会显示为 1 天后。 absolute() 函数忽略了 +/- 混淆,所以你应该能够得到你需要的东西。

【讨论】:

    【解决方案2】:

    您可以order by 语句/逻辑,而不仅仅是列。所以,你可以使用类似的东西:

    ORDER BY theDate = CURDATE() DESC
    

    这应该将当前日期放在顶部。至于其他的,您可以添加第二个子句以按您的意愿对其进行排序:

    ORDER BY theDate = CURDATE() DESC, theDate DESC
    

    更新:如果您想要当前日期,然后是未来日期,然后是其他所有内容,您只需添加&gt; CURDATE()

    ORDER BY theDate = CURDATE() DESC,
        theDate > CURDATE() DESC,
        theDate ASC
    

    更新 2:这可以使用&gt;= CURDATE() 来简化。谢谢,@jarlh

    ORDER BY theDate >= CURDATE() DESC, theDate
    

    【讨论】:

    • OP 想要今天和未来的日期,然后是过去的日期。
    • @jarlh 我明白了...我想我可以解决这个问题 :)
    • ORDER BY theDate &gt;= CURDATE() DESC, theDate
    • @jarlh 我想过,但我不确定它是否会将当前日期放在首位(使用&gt;=)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多