如何在PostgreSQL中按距离从现在开始排序()(未来优先)
我有一个如何在PostgreSQL中按距离从现在开始排序()(未来优先),sql,postgresql,Sql,Postgresql,我有一个date字段,显示从今天开始的天数。因此2055-01-01和1950-01-01将分别显示为正数和负数。现在我想把它们排序,让非负数以升序排在第一位,然后负数以降序排在第二位。例如: 0 1 2 3 4 -1 -2 -3 我已经用order by条款对其进行了修改: ORDER BY CASE expiry >= CURRENT_DATE WHEN true THEN expiry ELSE CURRENT_DATE + (CURRENT_D
date
字段,显示从今天开始的天数。因此2055-01-01
和1950-01-01
将分别显示为正数和负数。现在我想把它们排序,让非负数以升序排在第一位,然后负数以降序排在第二位。例如:
0
1
2
3
4
-1
-2
-3
我已经用order by条款对其进行了修改:
ORDER BY CASE expiry >= CURRENT_DATE
WHEN true THEN expiry
ELSE CURRENT_DATE + (CURRENT_DATE - expiry) + interval '1000 years'
END
由于日期是在几年内的今天,这是安全的推动消极日期的方式进入未来。然后,它们与当前日期的距离将颠倒
这是可行的,但是一个更优雅的解决方案会更好。以下方法也可以:
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
选择。。。哪里和到期日>=按到期日列出的当前订单
联合所有
选择。。。哪里和到期日<到期日描述的当前订单
如果用“i”代替diff计算,用@t代替表格,这应该会起作用+1当然!我最终使用了第一种解决方案,因为查询很长,而且速度目前还可以接受。这在PostgreSQL 12上不起作用:
函数abs(interval)不存在
select * from @t
order by
case when i >= 0 then 0 else 1 end,
case when i >= 0 then i else abs(i) end