sql - 将时间戳转换为整数问题

标签 sql postgresql

我的 pgsql 查询有问题,它抛出“错误:整数超出范围”。

我想要完成的是检查日期包含的 valid_to 字段('timestamp without timezone' 类型)是否与当前日期完全不同(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

因为我首先从时间戳中减去当前日期,所以转换为整数的值不应超出整数范围。当然有一些 NULL,但由于第一个查询通过 OK,所以这不是问题。

最佳答案

我想我找到了原因 - 在记录中有一个带有“valid_to”字段和“2050-01-01”日期的记录,而那条记录肯定引起了所有这些大惊小怪。因此,我添加了

AND valid_to < '2100-01-01'

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

关于sql - 将时间戳转换为整数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23534900/

相关文章:

sql - 将数据框与左侧或右侧的 Pandas 合并

mysql - 仅列出与另一个特定属性的所有其他记录链接的特定属性的记录

c# - 如何使用 Npgsql - 具有 IP 地址和外部端口的 NpgsqlConnection

postgresql - pgsql 存储过程 - 内部,c 或 sql 语言是最好的?

sql - 为什么 st_distance ('polygon from north pole' , 'point in italy' ) 结果给我 '0' ?

java - 如何使用数据库值自动填充jsp文本框而不使用按钮或提交?

java - 是否有一个API来检查列名是否为SQL关键字Java

sql - rails : Get related records having belonging to category having a particular enum attribute

php - 删除不同表中的条目 MysQL 查询

.net - 有没有办法加快读取数据的速度?