PostgreSQL查询:生成指定日期范围的ID与日期并筛选有效记录
PostgreSQL查询方案:筛选时间范围内的记录并生成ID和日期
针对你的需求,我会提供一个精准的PostgreSQL查询语句,同时处理started_at和ended_at可为空的场景,确保只保留与指定时间范围('2019-01-02'至'2019-01-04')相关的记录。
核心需求拆解
我们需要筛选出时间区间与目标范围存在重叠的记录,同时覆盖两种特殊情况:
ended_at为空:表示记录仍在进行中started_at为空:表示记录开始时间未明确
查询语句
假设你的表名为your_table,字段为id、started_at、ended_at,DATES为查询时的生成日期(用当前日期为例):
SELECT id AS "ID", CURRENT_DATE AS "DATES" FROM your_table WHERE -- 情况1:两个时间都存在,区间与目标范围重叠 (started_at <= '2019-01-04' AND ended_at >= '2019-01-02') -- 情况2:ended_at为空,记录在目标范围开始前或期间启动,且仍在进行 OR (started_at <= '2019-01-04' AND ended_at IS NULL) -- 情况3:started_at为空,记录在目标范围结束后或期间结束 OR (started_at IS NULL AND ended_at >= '2019-01-02');
自定义调整说明
如果DATES不是当前日期,而是其他逻辑(比如取记录的开始时间),只需替换CURRENT_DATE为对应的字段或表达式即可:
-- 示例:DATES取started_at的日期部分 SELECT id AS "ID", DATE(started_at) AS "DATES" FROM your_table WHERE -- 同上的筛选条件 (started_at <= '2019-01-04' AND ended_at >= '2019-01-02') OR (started_at <= '2019-01-04' AND ended_at IS NULL) OR (started_at IS NULL AND ended_at >= '2019-01-02');
这个查询会自动排除像ID为4这类完全不在目标时间范围内的记录,确保结果符合你的要求。
内容的提问来源于stack exchange,提问作者RIPOL92
相关产品推荐
相关产品推荐

