PostgreSQL中如何查询包含多个指定日期的日期范围行记录
找出包含指定日期列表的日期范围记录
针对你的需求,无需创建临时表,可通过以下几种方式动态处理日期集合:
方法1:使用数组+unnest(PostgreSQL专属)
利用PostgreSQL的数组和unnest函数将日期集合展开,结合EXISTS子查询匹配条件,逻辑清晰且无需临时表:
SELECT * FROM holiday WHERE EXISTS ( SELECT 1 FROM unnest(ARRAY['2022-08-01'::date, '2022-08-05'::date, '2022-08-20'::date, '2022-09-02'::date]) AS target_days(day) WHERE holiday.startDate <= target_days.day AND holiday.endDate >= target_days.day );
若需复用日期集合,可将数组定义为变量(如PL/pgSQL中),实现完全动态的日期输入。
方法2:字符串拆分(多数据库通用)
如果你的数据库支持字符串拆分函数,可将日期列表作为字符串传入并拆分,无需临时表:
MySQL示例:
SELECT DISTINCT h.* FROM holiday h JOIN JSON_TABLE( '["2022-08-01", "2022-08-05", "2022-08-20", "2022-09-02"]', '$[*]' COLUMNS(day DATE PATH '$') ) AS target_days WHERE h.startDate <= target_days.day AND h.endDate >= target_days.day;
SQL Server示例:
SELECT DISTINCT h.* FROM holiday h JOIN STRING_SPLIT('2022-08-01,2022-08-05,2022-08-20,2022-09-02', ',') AS s WHERE h.startDate <= CAST(s.value AS DATE) AND h.endDate >= CAST(s.value AS DATE);
这些方法直接通过内置函数动态处理日期集合,查询逻辑与你原有的单日期/多OR条件完全一致,且无需创建临时表。
内容的提问来源于stack exchange,提问作者j.davies
相关产品推荐
相关产品推荐

