SQL按日期和月份选择查询顺序

时间:2013-02-01 16:26:57

标签: mysql sql postgresql

让我们假装今天是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 个答案:

答案 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())的布尔值排序。
FALSETRUE之前排序NULL之前进行排序。

答案 2 :(得分:1)

这是另一种解决方案。当然,上述答案已经足够好了。你不能假设今天是2月3日,因为我们正在Now()代表Feb 2nd。所以我使用了演示数据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 |

答案 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)