如何按照PostgreSQL中now()(将来的第一个)的距离进行排序

时间:2012-09-13 07:54:31

标签: sql postgresql

我有一个date字段,显示为从今天开始的天数。因此2055-01-011950-01-01将分别显示为正数和负数。现在我想要对这些进行排序,以便非负数首先按升序排列,然后负数按降序排列。例如:

0
1
2
3
4
-1
-2
-3

3 个答案:

答案 0 :(得分:3)

以下内容也适用:

 ORDER BY expiry < CURRENT_DATE, abs(expiry - CURRENT_DATE)

但是,此表单不会使用索引按所需顺序生成行。如果您的查询将从中受益(从表中选择大多数行或使用限制),那么您将需要使用联合:

SELECT ... WHERE ... AND expiry >= CURRENT_DATE ORDER BY expiry
    UNION ALL
SELECT ... WHERE ... AND expiry < CURRENT_DATE ORDER BY expiry DESC

答案 1 :(得分:2)

select * from @t
order by 
case when i >= 0 then 0 else 1 end,
case when i >= 0 then i else abs(i) end

如果你将'i'替换为差异计算而将@t替换为你的表,那么这应该可以正常工作

答案 2 :(得分:1)

我用这个order by子句来攻击它:

ORDER BY CASE expiry >= CURRENT_DATE
         WHEN true THEN expiry
         ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
         END

由于日期是在今天的几年内,所以将负面日期推向未来是安全的。然后他们与当前日期的距离就会反转。

它有效,但更优雅的解决方案会很好。