基于多个日期值的postgres排序

时间:2017-09-14 08:01:42

标签: sql postgresql select sql-order-by

我有一个项目表,其中的项目包含start_at列(日期)end_at(日期)pauzed_at(日期)等。 我想根据日期值来订购项目。

排序应该是;

- STARTED projects
- PAUZED projects
- IDLE projects 
- ENDED projects

项目在日期介于start_at&之间时启动end_at

项目在未达到start_at日期时处于空闲状态。

项目在达到end_at日期时结束。

当paused_at设置等等时,

项目暂停。

如何根据项目的状态对此表进行排序?

2 个答案:

答案 0 :(得分:1)

状态可以用case表达式表示:

SELECT *
FROM   projects
ORDER BY CASE WHEN paused_at IS NOT NULL THEN 2 -- paused
              WHEN ended_at() < NOW() THEN 4 -- ended
              WHEN started_at() > NOW() THEN 3 -- idle
              ELSE 1 -- started
         END ASC

答案 1 :(得分:1)

false之前的

true次订单:

order by
    now() >= start_at and now() < end_at desc,
    paused_at is null,
    now() < start_at desc,
    now() >= end_at desc

case表达式是规划师的优化障碍。