按“与现在”的绝对距离对时间戳(包括将来)进行排序

时间:2012-09-17 13:55:13

标签: postgresql datetime sql-order-by postgresql-8.2

使用date字段,我可以this

ORDER BY ABS(expiry - CURRENT_DATE)

使用timestamp字段时出现以下错误:

  

功能abs(间隔)不存在

3 个答案:

答案 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指出的那样,它将分拣的粒度减少到一整天。