SQL Server 2016基于多日期列对比查询引擎特定数据的实现
SQL Server 2016 多日期筛选查询实现
以下是满足需求的SQL语句,同时处理了字符串日期的类型转换问题,避免比较逻辑错误:
SELECT engine, read_date, CASE WHEN cyl1_last_maint_date IS NOT NULL AND CONVERT(DATE, read_date, 101) > CONVERT(DATE, cyl1_last_maint_date, 101) THEN cyl1_read WHEN cyl1_last_maint_date IS NULL THEN cyl1_read ELSE NULL END AS cyl1_read, CASE WHEN cyl2_last_maint_date IS NOT NULL AND CONVERT(DATE, read_date, 101) > CONVERT(DATE, cyl2_last_maint_date, 101) THEN cyl2_read WHEN cyl2_last_maint_date IS NULL THEN cyl2_read ELSE NULL END AS cyl2_read FROM engine_reads WHERE (cyl1_last_maint_date IS NULL OR CONVERT(DATE, read_date, 101) > CONVERT(DATE, cyl1_last_maint_date, 101)) OR (cyl2_last_maint_date IS NULL OR CONVERT(DATE, read_date, 101) > CONVERT(DATE, cyl2_last_maint_date, 101)) ORDER BY engine, read_date;
逻辑说明
- 字段处理:通过
CASE表达式分别判断每个气缸的维护日期与读取日期的关系:- 若维护日期存在且读取日期晚于维护日期,保留对应气缸的读取值;
- 若维护日期不存在,直接保留读取值;
- 其他情况(维护日期存在但读取日期更早)将读取值置为
NULL。
- 行过滤:
WHERE子句排除掉两个气缸的读取都不符合条件的行(即两个气缸的维护日期都存在,且读取日期均早于维护日期的无效行)。 - 日期转换:使用
CONVERT(DATE, 字段, 101)将MM/DD/YYYY格式的字符串日期转为日期类型,确保日期比较逻辑准确。
内容的提问来源于stack exchange,提问作者bamjam
相关产品推荐
相关产品推荐

