2

假设今天是 2 月 3 日。

我有一张桌子:

CREATE TABLE devotion
(
  id serial NOT NULL,
  date timestamp without time zone
}

我有 4 条记录:

id date
1  2013-01-01
2  2013-02-02
3  2013-03-03
4  2013-04-04

我想构建一个选择查询,它将按以下顺序返回所有记录(按日期排序,但即将到来的日期在前,传递的日期附加到列表的末尾):

id date
3  2013-03-03 (upcoming dates first)
4  2013-04-04
1  2013-01-01 (passed dates appended to the end of the list)
2  2013-02-02

所有记录都是同一年。事实上,年不重要,只有日和月才重要。如果您能提出更好的结构,非常欢迎您。

4

4 回答 4

4

order by case when date1 > now() then 0 else 1 end case, date1

将给出 3,4,1,2 的顺序

于 2013-02-01T16:30:08.100 回答
2

更简单:

ORDER BY (date1 < now()), date1

您可以按表达式的布尔值排序(date1 < now())
FALSE排序之前TRUE排序之前NULL

于 2013-02-01T17:17:19.450 回答
1

这是另一个解决方案。当然,上面的答案已经足够好了。您不能假设今天是 2 月 3 日,因为我们采用Now()的是Feb 2nd. 所以我使用了演示数据2013-02-01。而这个答案主要取决于你的ID. 要说 ID 是连续的,日期也是如此。任何人都可以自由评论这个逻辑的狡猾部分..

MYSQL 演示

select id, `date`,
case when `date` > Date_Format(Now(),'%Y-%m-%d')
then id-3
else id+2 end as x
from demo
order by x asc
;

| ID |                            DATE | X |
--------------------------------------------
|  3 |    March, 03 2013 00:00:00+0000 | 0 |
|  4 |    April, 04 2013 00:00:00+0000 | 1 |
|  1 |  January, 01 2013 00:00:00+0000 | 3 |
|  2 | February, 01 2013 00:00:00+0000 | 4 |
于 2013-02-01T17:01:43.940 回答
0

如果您使用的是 MySQL,我会说只是使用RIGHT,但以下内容应该适用于 psql:

SELECT * FROM devotion ORDER BY substring(to_char( date, 'YYYY-MM-DD') from char_length(to_char( date, 'YYYY-MM-DD')) - 5)
于 2013-02-01T16:31:59.563 回答