Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中按距离从现在开始排序()(未来优先)_Sql_Postgresql - Fatal编程技术网

如何在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