让我们假装今天是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
所有记录都在同一年。事实上,一年并不重要,只有日和月。如果你能建议一个更好的结构,非常欢迎你。
答案 0 :(得分:4)
order by case when date1 > now() then 0 else 1 end case, date1
将给出3,4,1,2
的顺序答案 1 :(得分:2)
简单:
ORDER BY (date1 < now()), date1
您可以按表达式(date1 < now())
的布尔值排序。
FALSE
在TRUE
之前排序NULL
之前进行排序。
答案 2 :(得分:1)
这是另一种解决方案。当然,上述答案已经足够好了。你不能假设今天是2月3日,因为我们正在Now()
代表Feb 2nd
。所以我使用了演示数据2013-02-01
。这个答案主要取决于你的ID
。要说ID是顺序的,所以是日期。 任何人都可以对此逻辑的狡猾部分发表评论 ..
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 |
答案 3 :(得分: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)