我的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,但是当第一个查询通过时,它确实不是问题。
答案 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'