如何在Postgres中将时间差与秒数进行比较?

10

我希望在Postgres中创建一个过期条件。我有一个变量last_sync::timestamp和一个限制86400 * 30秒。我尝试过以下方式:

NOW() - last_sync > 86400 * 30

但它会给出一个错误:没有区间与整数的运算符。
即使last_sunc-infinity,我也想让它正常工作。
我该如何正确比较?

你的左侧有一个时间戳间隔,你可能需要将其转换为秒。 - AxelH
那么我该怎么做呢? - Fomalhaut
我有一个方案,但它看起来对于我的问题来说比较复杂。也许有更好的方法来解决过期问题。 - Fomalhaut
1
你需要将这个时间间隔转换成秒数,第二个链接中有明确的答案。另一个解决方案是从NOW()中减去86400*30并将其与last_sync进行比较。这将给你两个时间戳进行比较,这更容易(或将该值添加到last_sync中;))。 - AxelH
感谢 @AxelH。我也想看看其他建议。 - Fomalhaut
3个回答

15

使用间隔 ==> 日期/时间函数与操作符

create table asd(
   name varchar(20),
   last_sync timestamp
)
;

insert into asd values( 'one', now() - interval '500' hour );
insert into asd values( 'two', now() - interval '1500' hour );


SELECT * 
from asd
where NOW() - last_sync > ( 86400 * 30 ) * INTERVAL '1' second

name |last_sync           |
-----|--------------------|
two  |2016-10-26 00:52:16 |
如果 last_sync 是负无穷,该怎样使其工作? - Fomalhaut 5分钟前
insert into asd values( 'one', now() - interval '500' hour );
insert into asd values( 'two', now() - interval '1500' hour );

insert into asd values( 'minus infinity', timestamp '-infinity' );
insert into asd values( 'plus infinity', timestamp 'infinity' );


SELECT * 
from asd
where last_sync > NOW() - ( 86400 * 30 ) * INTERVAL '1' second

name          |last_sync                |
--------------|-------------------------|
one           |2016-12-06 15:52:12      |
plus infinity |292278994-08-17 00:00:00 |

我已经添加了一个示例,说明如何检查无穷大。 - krokodilko
谢谢!我使用了这个表达式 last_sync < NOW() - INTERVAL '30 days',它起作用了。 - Fomalhaut
看到你的昵称,我想说:来自莫斯科的问候! - Fomalhaut

2
您可以将86400 * 30转换为秒的间隔
interval '2592000 second'

然后您可以进行比较:
select (now() - '2016-12-02') > interval '2592000 second';

这个选择器返回:
False   

您可以将整数转换为时间间隔(interval):
(86400 * 30) * interval '1 second'

谢谢,但是 last_sync = -infinity 怎么能工作呢? - Fomalhaut

-1
如果你是一位数学家,阅读这段内容
NOW() - last_sync > 86400 * 30

将会等于

NOW() > 86400 * 30 + last_sync

第一行中,您有interval > integer,第二行中,您有timestamp > timestamp。最后一个没有类型问题。

我不太了解PostgreSQL,无法编写解决方案,但是您可以从该解决方案开始。使用正确的函数将值添加到时间戳中。


同样的问题:没有整数和时间戳的运算符。 - Fomalhaut
1
如果您尝试使用我编写的代码,这似乎是合理的,因为这只是一个伪代码...但阅读此链接以了解如何正确添加所需值可能会有所帮助。您需要编写类似于+ interval '30 days'的内容。请注意,我已经进行了搜索,并在不到2分钟的时间内找到了此链接。我对postgresql规范没有任何了解。 - AxelH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接