我希望在Postgres中创建一个过期条件。我有一个变量last_sync::timestamp
和一个限制86400 * 30
秒。我尝试过以下方式:
NOW() - last_sync > 86400 * 30
但它会给出一个错误:没有区间与整数的运算符。
即使
last_sunc
是-infinity
,我也想让它正常工作。我该如何正确比较?
我希望在Postgres中创建一个过期条件。我有一个变量last_sync::timestamp
和一个限制86400 * 30
秒。我尝试过以下方式:
NOW() - last_sync > 86400 * 30
last_sunc
是-infinity
,我也想让它正常工作。使用间隔 ==> 日期/时间函数与操作符
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 |
last_sync < NOW() - INTERVAL '30 days'
,它起作用了。 - Fomalhaut86400 * 30
转换为秒的间隔
:interval '2592000 second'
select (now() - '2016-12-02') > interval '2592000 second';
False
interval
):(86400 * 30) * interval '1 second'
last_sync = -infinity
怎么能工作呢? - FomalhautNOW() - last_sync > 86400 * 30
将会等于
NOW() > 86400 * 30 + last_sync
第一行中,您有interval > integer
,第二行中,您有timestamp > timestamp
。最后一个没有类型问题。
我不太了解PostgreSQL,无法编写解决方案,但是您可以从该解决方案开始。使用正确的函数将值添加到时间戳中。
+ interval '30 days'
的内容。请注意,我已经进行了搜索,并在不到2分钟的时间内找到了此链接。我对postgresql规范没有任何了解。 - AxelH
86400*30
并将其与last_sync
进行比较。这将给你两个时间戳进行比较,这更容易(或将该值添加到last_sync中;))。 - AxelH