Sql Postgres将时间戳与长unix时间戳进行比较

Sql Postgres将时间戳与长unix时间戳进行比较,sql,postgresql,Sql,Postgresql,我在一个表中有一个timestamp属性,我想在sql查询中放置一个条件,其中条件值是unix时间戳(即长数值) 如何执行此操作?您可以使用提取(epoch from…从任何PostgreSQL时间和日期类型获取Unix时间戳(请参阅) 因此,可以编写查询片段: [...] extract(epoch from table.timestampattr) > 6456454654 [...] 或者,to_timestamp函数执行相反的转换,因此您也可以编写: [...] table.ti

我在一个表中有一个timestamp属性,我想在sql查询中放置一个条件,其中条件值是unix时间戳(即长数值)

如何执行此操作?

您可以使用
提取(epoch from…
从任何PostgreSQL时间和日期类型获取Unix时间戳(请参阅)

因此,可以编写查询片段:

[...] extract(epoch from table.timestampattr) > 6456454654 [...]
或者,
to_timestamp
函数执行相反的转换,因此您也可以编写:

[...] table.timestampattr > to_timestamp(6456454654) [...]

这里要说明的是,timestamp()是更好的选择。它的计算结果为常数。必须为每一行计算从时间戳列提取历元。@MikeSherrill'Catcall'很好。关键是
to_timestamp
被定义为
不可变的
,因此查询计划员应该知道运行它一次并缓存结果。这两个函数都是不可变的。不同之处在于,在本例中,to_timestamp()是用常量参数调用的,extract()是用每行上的不同参数调用的。如果OP已将Unix历元存储在表中,并且需要将其与timestamp类型的常量值进行比较,则extract()将是更好的选择。@MikeSherrill'Catcall'没错!我想我所摸索的是一个提示,告诉那些不熟悉的人,是函数的
不可变
属性使这成为可能,而不是一些内部魔法。用户定义的函数(例如,用于转换MS“ticks”值)如果定义为
不可变
,将获得相同的性能优势,但如果不是,则将对每一行进行评估。@JackGibson“Sat,09 Feb 2013 13:45:25 UTC”的Unix时间戳为1360417525;看起来你的精度是毫秒,而不是秒
to_timestamp
接受浮点数,因此您可以添加一个小数点并获取后面的值:
选择to_timestamp(1360417525.156)
[...] table.timestampattr > to_timestamp(6456454654) [...]