l0b*_*0b0 5 postgresql datetime sql-order-by postgresql-8.2
随着date现场我可以做这个:
ORDER BY ABS(expiry - CURRENT_DATE)
Run Code Online (Sandbox Code Playgroud)
使用timestamp字段我收到以下错误:
函数abs(interval)不存在
Erw*_*ter 10
出于此目的使用now()或CURRENT_TIMESTAMP.
您的查询结果不同的原因是:
当您减去两个类型的值时date,结果为a integer并且abs()适用.
当您减去两个类型的值timestamp(或只有一个是a timestamp)时,结果为a interval,并且abs()不适用.您可以用CASE表达式替换:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Run Code Online (Sandbox Code Playgroud)
或者你可以从像@Craig这样的结果中展示extract()unix .我引用:"对于间隔值,间隔中的总秒数".然后你可以再次使用:epochintervalabs()
ORDER BY abs(extract(epoch from (expiry - now())));
Run Code Online (Sandbox Code Playgroud)
age()通过将天数总结为数月和数年,可以为间隔添加更具人性化的表示,以获得更大的间隔.但这不是重点:该值仅用于排序.
由于您的列的类型为timestamp,您应该使用CURRENT_TIMESTAMP(或now())代替 CURRENT_DATE,或者您将得到不准确的结果(甚至不适用于"today").
这有效(并给出正确的排序):
ABS(EXTRACT(DAY FROM expiry - CURRENT_TIMESTAMP))
Run Code Online (Sandbox Code Playgroud)
不幸的是,正如 Erwin Brandstetter 指出的那样,它将排序的粒度降低到了一整天。