如何在Rails中查询指定时间段记录?PostgreSQL查询返回nil
问题分析与解决方案
你的问题核心是时区转换逻辑不符预期:PostgreSQL中带时区的时间戳(对应Rails的datetime字段,数据库类型为timestamptz)直接用::time提取时间部分时,会先转换为数据库默认时区的本地时间,而非你看到的EST时区的12:12:10,导致查询匹配失败。
解决方法:
先确认数据库时区
执行SQL查看数据库默认时区:SHOW TIMEZONE;如果结果不是
America/New_York(EST对应的标准时区标识符,建议用全名而非缩写避免歧义),直接转::time得到的时间必然和你预期的EST时间不一致。修正查询语句
需要先将时间戳转换为指定时区的本地时间,再提取时间部分:find_by("(datetime_field AT TIME ZONE 'America/New_York')::time BETWEEN '12:12:00' AND '12:13:00'")或者用更符合Rails风格的写法:
where( "(datetime_field AT TIME ZONE 'America/New_York')::time >= ? AND (datetime_field AT TIME ZONE 'America/New_York')::time <= ?", '12:12:00', '12:13:00' ).first
原理说明
你的字段值Mon, 06 Nov 2022 12:12:10.000000000 EST -05:00是带时区的时间戳,PostgreSQL存储时会统一转为UTC时间。直接用datetime_field::time时,数据库会把UTC时间转换为自身默认时区的本地时间再提取时分秒;而通过AT TIME ZONE 'America/New_York',会先把UTC时间转换回EST时区的本地时间,再提取时间部分,这样就能精准匹配你预期的时间范围。
内容的提问来源于stack exchange,提问作者user17443811
相关产品推荐
相关产品推荐

