如何比较Postgres中的时差与秒数?

时间:2016-12-27 10:35:25

标签: postgresql

我想在Postgres中创建一个到期条件。我有一个可变的last_sync::timestamp和一个限制86400 * 30秒。我试过这种方式:

NOW() - last_sync > 86400 * 30

但它给出了一个错误:没有运算符的间隔>整数。

即使last_sunc-infinity,我也希望它能够正常运作。

如何正确进行比较?

3 个答案:

答案 0 :(得分:3)

使用interval ==> Date/Time Functions and Operators

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是-infinity,如何使其工作? - 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 |

答案 1 :(得分:0)

如果您将其视为数学家

app.post('/submit', function(req, res) {
    var q = req.query;
    var params = [q.email, q.company, q.subject, q.text];

    db.serialize()
        .then(() => db.run("INSERT INTO users VALUES (?, ?, ?, ?)", params))
        .then(() => res.status(200).end())
        .catch((err) => {
            console.error(err);
            res.status(400).end();
        });
    });
});

等于

<Assertion>...</Assertion>

对于第一行,您有NOW() - last_sync > 86400 * 30 第二行,您有NOW() > 86400 * 30 + last_sync 。没有最后一个类型的问题。

我不知道PostgreSQL应该编写解决方案但是你有一个良好的开端。使用正确的函数将值添加到时间戳。

答案 2 :(得分:0)

您可以将86400 * 30转换为interval秒:

interval '2592000 second'

然后你可以比较:

select (now() - '2016-12-02') > interval '2592000 second';

此选择返回:

False   

您可以将integer转换为interval

(86400 * 30) * interval '1 second'