使用date
字段,我可以执行this:
ORDER BY ABS(expiry - CURRENT_DATE)
使用
timestamp
字段,我得到以下错误:最佳答案
为此目的使用 now() or CURRENT_TIMESTAMP。
查询结果不同的原因是:
当您减去 date
类型的两个值时,结果是 integer
并且 abs()
是适用的。
当您减去两个 timestamp
类型的值(或者只有一个是 timestamp
)时,结果是 interval
,并且 abs()
不适用。您可以用 CASE
表达式替换:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
或者,您可以
extract()
来自生成的 epoch
的 unix interval
,就像@Craig 已经演示的那样。我引用:“对于间隔值,间隔中的总秒数”。然后你可以再次使用 abs()
:ORDER BY abs(extract(epoch from (expiry - now())));
age()
只会通过将天数汇总为月和年以获得更大的间隔来为间隔添加更易读的表示。但这不是重点:该值仅用于排序。由于您的列的类型为timestamp,因此应使用
CURRENT_TIMESTAMP
(或now()
)而不是CURRENT_DATE
,否则结果将不准确(或者对于“today”而言甚至是错误的)。关于postgresql - 按与 "now"的绝对距离对时间戳(包括 future )进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12460797/