【问题标题】:How to order by dates with time periods with current date first then future time periods and then past time periods?如何按日期排序,时间段首先是当前日期,然后是未来时间段,然后是过去时间段?
【发布时间】:2021-03-24 19:50:50
【问题描述】:

我有一个包含 ID、START_DATE 和 END_DATE 列的表。我想要做的是执行一个查询,它按以下顺序对结果行进行排序:

如果当前日期是 2020-12-14 那么结果应该是

START_DATE  END_DATE
2020-12-8   2020-12-18     -----> Time periods which contains current day and are ordered by start_date in ASCENDING order.
2020-12-9   2020-12-15     
2020-12-10  2020-12-17     
2020-12-15  2020-12-17     -----> Time periods with START DATE > current date and are ordered by start_date in ASCENDING order.
2020-12-16  2020-12-22
2020-12-21  2020-12-25
2020-12-9   2020-12-13     ----->Time periods with END DATE < current date and are ordered by start_date in DESCENDING order.
2020-12-6   2020-12-8
2020-12-1   2020-12-9

我怎样才能做到这一点?

【问题讨论】:

  • 当您演示 MySQL 的示例数据时,请始终使用YYYY-MM-DD 日期格式。

标签: mysql sql date sql-order-by


【解决方案1】:

你需要类似的东西

ORDER BY CASE WHEN CURRENT_DATE BETWEEN start_date AND end_date
              THEN 1
              WHEN start_date > CURRENT_DATE
              THEN 2
              ELSE 3 END,
         CASE WHEN end_date > CURRENT_DATE
              THEN start_date + 0
              ELSE DATEDIFF(CURRENT_DATE, start_date)
              END

fiddle

start_date + 0 需要用于将此 CASE 的结果转换为数字。如果没有它,CASE 替代方案会结合日期和数值,这会导致最终数据类型为字符串 - 排序顺序错误。

【讨论】:

    【解决方案2】:

    你可以使用conditional ordering如下:

    Select * from your_table
    Order by 
      case when CURRENT_DATE between start_date and end_date OR start_date > CURRENT_DATE 
           then 1
           When end_date < CURRENT_DATE 
           then 2 
      end,
      case when CURRENT_DATE between start_date and end_date or start_date > CURRENT_DATE 
           then date_diff(start_date, CURRENT_DATE) 
           When end_date < CURRENT_DATE 
           then date_diff(CURRENT_DATE,start_date) 
      end 
    

    【讨论】:

      【解决方案3】:

      在 MySQL 中,我会这样写:

      order by (curdate() between start_date and end_date) desc,
               (curdate() > curdate()) desc
      

      case 不需要表达式,因为 MySQL 将布尔值视为一个数字,1 为真,0 为假。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多