MySQL - 排序第一个未来事件然后过去事件

时间:2017-10-14 09:36:46

标签: php mysql sql

今天是:2017-10-14,这是一个事件日期表:

... 
2017-10-18
2017-10-17
2017-10-16
2017-10-14
2017-10-12
2017-10-10
2017-10-09
....

我想像这样排序表

...
2017-10-14
2017-10-16
2017-10-17
2017-10-18
2017-10-12
2017-10-10
2017-10-09
....

我怎样才能使用MySQL?

4 个答案:

答案 0 :(得分:1)

尝试这样的事情

ORDER  BY CASE 
            WHEN eventdate = Cast(now() AS DATE) THEN 1 
            WHEN eventdate < Cast(now() AS DATE) THEN -1 
            ELSE 0
          END DESC, 
          case when eventdate < Cast(now() AS DATE) then eventdate end desc,
          case when eventdate > Cast(now() AS DATE) then eventdate end asc

答案 1 :(得分:0)

您只需使用两个CASE表达式即可完成所需的排序。第一种情况将当前和未来事件与先前事件分开。第二种情况命令当前和未来事件递增,先前事件递减。

SELECT
    date
FROM yourTable
ORDER BY
    CASE WHEN date >= CURDATE() THEN 0 ELSE 1 END,
    CASE WHEN date >= CURDATE()
        THEN UNIX_TIMESTAMP(date) ELSE -UNIX_TIMESTAMP(date) END;

<强>输出:

    date
1   14.10.2017 00:00:00
2   16.10.2017 00:00:00
3   17.10.2017 00:00:00
4   18.10.2017 00:00:00
5   12.10.2017 00:00:00
6   10.10.2017 00:00:00
7   09.10.2017 00:00:00

在这里演示:

Rextester

答案 2 :(得分:0)

order by 
  case when DateCol >= cast(now() as date) then DateCol
  --                   ^^ I use this cast is needed to ignore time part of comparing
  else now() - DateCol 
  end

SQL Fiddle Demo

答案 3 :(得分:0)

MySQL方便地将布尔值视为数字上下文中的数字。所以一个简单的方法是:

where (datecol >= curdate()) desc,  -- put future dates first,
      (case when datecol >= curdate() then datecol end) asc,
      datecol desc

我喜欢第一个条件,因此很清楚订购的目的是什么。