查询含reject date与accept date字段,如何仅筛选最早日期在指定范围的记录?
解决方案:精准筛选符合要求的日期记录
明白了,你想要的其实是只保留两类记录:要么两个日期都落在指定区间里,要么其中一个日期在区间内、另一个完全为空。而要排除那种两个日期都存在,但其中一个在区间外的情况(比如你提到的reject在12/20、accept在1/5的记录)。我给你整理一下对应的查询逻辑和写法:
核心筛选逻辑
我们需要把三种符合要求的情况用OR连接起来:
- 情况1:
reject_date和accept_date都不为空,且两者都在目标日期区间内; - 情况2:
reject_date在区间内,且accept_date为空; - 情况3:
accept_date在区间内,且reject_date为空;
具体SQL示例
假设你的表名为records,目标日期区间是'2023-12-01'到'2023-12-31',对应的查询可以写成:
SELECT * FROM records WHERE -- 两个日期都在区间内 (reject_date BETWEEN '2023-12-01' AND '2023-12-31' AND accept_date BETWEEN '2023-12-01' AND '2023-12-31') -- 仅reject date存在且在区间内 OR (reject_date BETWEEN '2023-12-01' AND '2023-12-31' AND accept_date IS NULL) -- 仅accept date存在且在区间内 OR (accept_date BETWEEN '2023-12-01' AND '2023-12-31' AND reject_date IS NULL);
效果验证
- 对于你提到的那条
reject_date='2023-12-20'、accept_date='2024-01-05'的记录:因为它的accept_date不在区间内,且两个日期都不为空,所以不会被筛选出来,正好符合你的排除需求; - 对于只有
reject_date(比如'2023-12-15')、accept_date为空的记录:会被正常包含; - 对于两个日期都在12/1-12/31内的记录:也会被保留。
可选简化写法(适合熟悉函数的场景)
如果你的数据库支持COALESCE和条件判断,也可以用更简洁的逻辑表达“所有非空的日期都必须在区间内”:
SELECT * FROM records WHERE -- 确保至少有一个日期在区间内 COALESCE(reject_date, accept_date) BETWEEN '2023-12-01' AND '2023-12-31' -- 同时确保所有非空日期都在区间内 AND (reject_date IS NULL OR reject_date BETWEEN '2023-12-01' AND '2023-12-31') AND (accept_date IS NULL OR accept_date BETWEEN '2023-12-01' AND '2023-12-31');
不过第一种写法更直观,容易理解和维护,推荐优先使用。
内容的提问来源于stack exchange,提问作者VG3
相关产品推荐
相关产品推荐

