如何查询包含当前年份的tsrange类型所有数据?
PostgreSQL tsrange 筛选包含指定年份的行
要筛选出time_range列与2024年有重叠的行,你需要用PostgreSQL范围类型的重叠操作符&&,它用来判断两个范围是否存在交集。
正确查询语句
SELECT time_range FROM holidays WHERE user_id = 1 AND time_range && tsrange('2024-01-01', '2025-01-01', '[)');
语句说明
tsrange('2024-01-01', '2025-01-01', '[)'):构造2024年的完整时间范围(左闭右开,包含2024年01月01日00:00:00到2024年12月31日23:59:59的所有时间)。&&:重叠操作符,只要time_range和2024年的范围有任意交集,就会被选中。比如("2024-12-02", "2025-01-02")和2024年的范围在2024-12-02到2025-01-01之间有重叠,因此会被包含在结果中。
动态适配当前年份
如果需要自动适配当前年份,不用硬编码2024,可以用date_trunc函数动态生成范围:
SELECT time_range FROM holidays WHERE user_id = 1 AND time_range && tsrange( date_trunc('year', current_timestamp), date_trunc('year', current_timestamp) + interval '1 year', '[)' );
原查询不生效的原因
你之前用的<@是包含于操作符,要求time_range完全被后面的范围包含,这会漏掉那些跨年份但和目标年份有重叠的行(比如你的例子中第二行),所以不符合需求。
内容的提问来源于stack exchange,提问作者serverz
相关产品推荐
相关产品推荐

