含空End_dt字段的日期范围客户数据提取失败求助
解决日期范围查询中无法提取End_dt为空客户的问题
核心问题分析
你无法提取End_dt为空的客户,通常是因为错误地用End_dt = ''判断空值——数据库中空值一般用NULL表示,必须用End_dt IS NULL来匹配。部分场景下空值也可能存储为空白字符串,因此需要同时判断两种情况。
合并后的查询逻辑
你的四个查询条件可简化为:
Start_dt不晚于31/12/2023- 同时满足
End_dt为空,或End_dt早于01/01/2024(即31/12/2023)
通用SQL查询语句(以MySQL为例)
SELECT Client_Id, Start_dt, End_dt FROM your_table_name WHERE -- 转换日期格式为数据库可识别格式,确保比较准确 STR_TO_DATE(Start_dt, '%d/%m/%Y') <= STR_TO_DATE('31/12/2023', '%d/%m/%Y') AND ( End_dt IS NULL -- 匹配NULL类型的空值 OR End_dt = '' -- 匹配空白字符串类型的空值 OR STR_TO_DATE(End_dt, '%d/%m/%Y') < STR_TO_DATE('01/01/2024', '%d/%m/%Y') );
严格对应原始四个条件的SQL语句
如果需要完全贴合你列出的四个条件,可使用以下写法:
SELECT Client_Id, Start_dt, End_dt FROM your_table_name WHERE -- 条件1: Start_dt早于01/07/2023且End_dt为空 (STR_TO_DATE(Start_dt, '%d/%m/%Y') < STR_TO_DATE('01/07/2023', '%d/%m/%Y') AND (End_dt IS NULL OR End_dt = '')) OR -- 条件2: Start_dt早于01/07/2023且End_dt早于31/12/2023 (STR_TO_DATE(Start_dt, '%d/%m/%Y') < STR_TO_DATE('01/07/2023', '%d/%m/%Y') AND STR_TO_DATE(End_dt, '%d/%m/%Y') < STR_TO_DATE('31/12/2023', '%d/%m/%Y')) OR -- 条件3: Start_dt在01/07/2023至31/12/2023之间且End_dt早于31/12/2023 (STR_TO_DATE(Start_dt, '%d/%m/%Y') BETWEEN STR_TO_DATE('01/07/2023', '%d/%m/%Y') AND STR_TO_DATE('31/12/2023', '%d/%m/%Y') AND STR_TO_DATE(End_dt, '%d/%m/%Y') < STR_TO_DATE('31/12/2023', '%d/%m/%Y')) OR -- 条件4: Start_dt在01/07/2023至31/12/2023之间且End_dt为空 (STR_TO_DATE(Start_dt, '%d/%m/%Y') BETWEEN STR_TO_DATE('01/07/2023', '%d/%m/%Y') AND STR_TO_DATE('31/12/2023', '%d/%m/%Y') AND (End_dt IS NULL OR End_dt = ''));
结果验证
执行上述语句后,会精准提取你预期的客户:Client a、Client b、Client c、Client d、Client e、Client f。
内容的提问来源于stack exchange,提问作者Arghwork
相关产品推荐
相关产品推荐

