答案 0 :(得分:10)
出于此目的使用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
或者您可以{@ 3}}生成的epoch
中的@ interval
已经证明了@Craig。我引用:“对于间隔值,间隔中的总秒数”。然后,您可以再次使用abs()
:
ORDER BY abs(extract(epoch from (expiry - now())));
extract()
只会通过将天数总结为数月和数年来为间隔添加更具人性化的表示,以获得更大的间隔。但这不是重点:该值仅用于排序。
由于您的列属于时间戳类型,因此您应该使用CURRENT_TIMESTAMP
(或now()
)代替CURRENT_DATE
,否则您将获得不准确的结果(甚至是“今天”不正确)
答案 1 :(得分:0)
与current_timestamp
SELECT the_timestamp > current_timestamp;
age
函数可能是您在比较时所需的功能:
SELECT age(the_timestamp);
例如:
regress=# SELECT age(TIMESTAMP '2012-01-01 00:00:00');
age
----------------
8 mons 17 days
(1 row)
如果您想要绝对距离,请使用:
SELECT abs( extract(epoch from age(the_timestamp)) );
答案 2 :(得分:0)
这有效(并提供正确的排序):
ABS(EXTRACT(DAY FROM expiry - CURRENT_TIMESTAMP))
不幸的是,正如Erwin Brandstetter指出的那样,它将分拣的粒度减少到一整天。