随着date字段我可以做这个

ORDER BY ABS(expiry - CURRENT_DATE)

使用timestamp字段,我收到以下错误:

函数abs(interval)不存在

#1楼 票数:10

出于此目的使用now()或CURRENT_TIMESTAMP

您的查询结果不同的原因是:

当你减去两个date类型的值时,结果是一个integerabs()是适用的。
当您减去两个timestamp类型的值(或者只有一个是timestamp )时,结果是一个interval ,而abs()不适用。 您可以使用CASE表达式替换:

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

或者你可以从结果interval extract() unix epoch ,就像@Craig已经演示过的那样。 我引用:“对于间隔值,间隔中的总秒数”。 然后你可以再次使用abs()

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

age()只会通过将天数总计为几个月和几年来为间隔添加更具人性化的表示,以获得更大的间隔。 但这不是重点:该值仅用于排序。

由于您的列的类型为timestamp,您应该使用CURRENT_TIMESTAMP (或now() )而不是CURRENT_DATE ,否则您将得到不准确的结果(甚至是“today”的错误)。

#2楼 票数:1

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)) );

#3楼 票数:0 已采纳

这工作(并给出正确的排序):

ABS(EXTRACT(DAY FROM expiry - CURRENT_TIMESTAMP))

不幸的是,正如Erwin Brandstetter指出的那样,它将分拣的粒度减少到一整天。

  ask by l0b0 translate from so

未解决问题?本站智能推荐:

1回复

使用PostgreSQL按日期时间对嵌套对象进行排序

我想按创建或更新帖子的频率对董事会分类。 我已经能够做到这一点,但是确切的订购仍然没有。 例如,如果我有2个帖子(A,B)并更新了B,则该帖子仍排在A的第二位。我以前在PostgreSQL中遇到过此问题,并使用对象的id作为辅助排序列来解决它。 不幸的是,在这种情况下,我要按职位去。 根
2回复

优化涉及PostgreSQL一组时间最大下限的查询

我在PostgreSQL 8.2的分叉版本上已经适应了MPP。 我试图从两个较大的表中计算出一系列tiestamps的最大下限。 以下是前述表格的示例: 对于表A每一行,我想加入表B每个时间戳的“最大下限”的附加列。 也就是说,我想要一个包含表B中所有值的最大时间的列,并且还小于或
2回复

对没有窗口函数的行进行编号

在Postgresql 8.2中,我想按顺序编号行。 我有表t在SQL小提琴 : 我要这个: 我试过这个: 得到了:
1回复

如何对时间戳进行分类?

这是我的桌子: 现在,我要这样选择: 好吧,我现在所能做的就是选择: 正如我所说,此查询^仅选择今天的时间戳。 我的问题:现在,我想知道如何将查询扩展到{今天​​,昨天-上周}?
6回复

C#/。NET将来的相对时间戳?

我正在寻找一种制作相对文本时间戳的方法,但要使用future而不是过去(不是“ 2天前”而是“ 2天之内”)。 我正在为个人用途创建个人任务管理器,我想告诉我“此任务将在2天内到期”。 但是我似乎找不到任何东西可以将DateTime转换为这种时间戳。
1回复

为什么使用sort_values对时间戳进行排序不起作用?

我有一列时间戳转换为人类可读的形式。 我试图从时代开始以及转换后对其进行排序。 给我 没有排序。 我用过sort_values() 为什么它不起作用?
1回复

使用 Python 对 CSV 文件中的时间戳进行排序

我正在尝试按给定的时间戳对 csv 文件的内容进行排序,但它似乎对我不起作用。 它们以这样的方式给出: 我目前的代码: 但是它总是抛出错误: time data '2021-04-16 12:59:26+02:00' does not match format '%Y-%m-%d %H:%M
4回复

在SQL中:按相关元素时间戳对唯一元素进行排序

我有两个表“贷款”和“付款”。 贷款具有贷款状态,并可能附带有付款。 付款具有贷款编号,逾期状态和处理日期。 我想获得所有具有loan_status = 1的贷款的清单,这些贷款至少有一项现有的过期= true付款,并按匹配的付款处理日期排序。 以下是一些示例数据: 使用