2013-02-01 61 views
2

今天假装是2月3日。按日期和月份SQL选择查询顺序

而且我有一个表:

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 

All reco rds有同一年。实际上,一年并不重要,只有一天一个月。如果你能建议一个更好的结构,你非常欢迎。

+0

可能使用具有特定排序顺序的两个查询的联合以及where子句 – Resh32

+0

是不是觉得你需要'desc'的命令... – bonCodigo

+0

@Lamak谢谢。期货和过去的日期'ASC' ...有趣。 +1的问题。 – bonCodigo

回答

4

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

会给3,4,1,2

+0

你可以添加select子句吗? – Dziamid

+0

哇,这真的起作用,只是在这里添加对文档的引用:http://www.postgresql.org/docs/8.4/static/functions-conditional.html – Dziamid

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) 
1

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

MYSQL DEMO

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 | 
2

简单:

ORDER BY (date1 < now()), date1 

你可以通过表达式的布尔值顺序(date1 < now())
FALSETRUE之前的排序NULL之前的排序。

相关问题