将时间戳转换为整数问题

时间:2014-05-08 06:59:16

标签: sql postgresql

我的pgsql查询有一个问题,就是抛出" ERROR:整数超出范围"。

我想要完成的是检查包含valid_to字段的日期(没有时区'类型的时间戳)是否与当前日期完全相同(N *间隔)。在查询失败的示例中,我正在使用" 7776000"间隔(90天)和" 1399327200"作为unix时间的当前日期。

什么有效:

SELECT 
    *,
    (CAST((EXTRACT(EPOCH FROM et.valid_to) - 1399327200 ) as integer) % 7776000) as modulo
FROM example_table et 
WHERE et.valid_to IS NOT NULL

什么不是:

WITH table_refined as (
    SELECT 
        *,
        (CAST((EXTRACT(EPOCH FROM et.valid_to) - 1399327200 ) as integer) % 7776000) as modulo
    FROM example_table et 
    WHERE et.valid_to IS NOT NULL 
)
SELECT * from table_refined WHERE modulo=0

也不是这样:

SELECT * FROM (
    SELECT 
        *,
        (CAST((EXTRACT(EPOCH FROM et.valid_to) - 1399327200 ) as integer) % 7776000) as modulo
    FROM example_table et
    WHERE et.valid_to IS NOT NULL 
)
AS table_temp 
WHERE table_temp.modulo = 0

由于我首先从时间戳中减去当前日期,因此castet到整数的值不应超出整数范围。当然有一些NULL,但是当第一个查询通过时,它确实不是问题。

2 个答案:

答案 0 :(得分:1)

我想我找到了原因 - 在记录中有一个有' valid_to'字段' 2050-01-01'约会,那一定肯定引起了所有这些大惊小怪。因此,我添加了

AND valid_to < '2100-01-01'

我的查询是什么让它最终起作用。尽管unix时间是在2038年达到整数限制,但看起来像postgresql强制转换使其达到无符号整数最大值,因此限制记录到2100年可以工作。

答案 1 :(得分:0)

我无法看到错误原因,但您可以通过使用间隔

来避免这一切
select *,
    valid_to,
    valid_to - currrent_date - 90 * interval '1 day'
from et
where
    valid_to is not null
    and
    valid_to - currrent_date = 90 * interval '1 day'