Sort timestamps (including future) by absolute distance from “now”

放肆的年华 提交于 2019-12-12 10:48:59

问题


With a date field I can do this:

ORDER BY ABS(expiry - CURRENT_DATE)

With a timestamp field I get the following error:

function abs(interval) does not exist


回答1:


Use now() or CURRENT_TIMESTAMP for the purpose.

The reason for the different outcome of your queries is this:

When you subtract two values of type date, the result is an integer and abs() is applicable.
When you subtract two values of type timestamp (or just one is a timestamp), the result is an interval, and abs() is not applicable. You could substitute with a CASE expression:

ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END

Or you can extract() the unix epoch from the resulting interval like @Craig already demonstrated. I quote: "for interval values, the total number of seconds in the interval". Then you can use abs() again:

ORDER BY abs(extract(epoch from (expiry - now())));

age() would just add a more human readable representation to the interval by summing up days into months and years for for bigger intervals. But that's beside the point: the value is only used for sorting.

As your column is of type timestamp, you should use CURRENT_TIMESTAMP (or now()) instead of CURRENT_DATE, or you will get inaccurate results (or even incorrect for "today").




回答2:


Compare with current_timestamp

SELECT the_timestamp > current_timestamp;

The age function is probably what you want when comparing them:

SELECT age(the_timestamp);

eg:

regress=# SELECT age(TIMESTAMP '2012-01-01 00:00:00');
      age       
----------------
 8 mons 17 days
(1 row)

If you want an absolute distance, use:

SELECT abs( extract(epoch from age(the_timestamp)) );



回答3:


This works (and gives the correct sorting):

ABS(EXTRACT(DAY FROM expiry - CURRENT_TIMESTAMP))

Unfortunately, as Erwin Brandstetter pointed out, it reduces the granularity of the sorting to a full day.



来源:https://stackoverflow.com/questions/12460797/sort-timestamps-including-future-by-absolute-distance-from-now

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!