SQL Server存储过程如何用@Date参数筛选多日期列数据
SQL Server 多日期列任意满足条件筛选实现
直接调整WHERE子句的判断逻辑,用OR关联三个日期列的阈值判断即可,同时兼容你原有@Date传NULL时返回全部行的逻辑,不需要冗余的CASE判断,写法更简洁易维护:
WHERE @Date IS NULL OR Ad_Date >= @Date OR Nurse_Date >= @Date OR Doc_Date >= @Date
逻辑说明
- 当存储过程传入的
@Date为NULL时,第一个判断条件直接成立,返回表中所有行,和你之前单列筛选的兼容行为完全一致 - 当
@Date传入具体时间值时,只要Ad_Date、Nurse_Date、Doc_Date三列中任意一列的值大于等于传入时间,对应行就会被返回 - 三列中存储的NULL值不需要额外处理:SQL Server中
NULL和任何值做大小比较都会返回UNKNOWN,在WHERE筛选中会被判定为不满足条件,刚好匹配「对应环节未记录时间则不可能满足时间阈值要求」的业务逻辑,不会出现误命中
效果匹配验证
对应你给出的两个测试场景:
- 传入
@Date = '2022-06-23 09:10'时,仅ID=323的行存在Nurse_Date = 2022-06-23 09:10等于阈值,其余行三列时间均小于该值,因此只返回第一行,符合预期 - 传入
@Date = '2022-06-23 09:07'时,ID=323的行Nurse_Date、Doc_Date均大于阈值,ID=886的行Doc_Date大于阈值,其余行三列时间均小于该值,因此返回第一行和第四行,符合预期
如果你一定要保留原有CASE写法的编码风格,也可以使用下面的等价写法,但可读性和维护性不如上面的简洁版本:
WHERE Ad_Date >= (CASE WHEN @Date IS NULL THEN Ad_Date ELSE @Date END) OR Nurse_Date >= (CASE WHEN @Date IS NULL THEN Nurse_Date ELSE @Date END) OR Doc_Date >= (CASE WHEN @Date IS NULL THEN Doc_Date ELSE @Date END)
内容的提问来源于stack exchange,提问作者KapSht
相关产品推荐
相关产品推荐

