SQL中如何判断传入年份是否在指定年份区间内(含空值处理)
如何编写正确的SQL Where子句来匹配年份区间(含yearTo为null的情况)
看了你给出的示例数据和预期结果,我明白你之前的条件为什么不对了——你搞反了年份的比较逻辑,而且没处理yearTo为null时的特殊规则(从示例看,yearTo为null时只有yearFrom等于传入年份才会被选中)。
先拆解你的需求逻辑,从示例数据(传入年份2010)来看,需要选中的行满足以下两种情况之一:
- 传入年份落在
yearFrom和yearTo的闭区间内(也就是yearFrom <= 传入年份 <= yearTo) yearFrom等于传入年份,且yearTo为null
对应的正确Where子句可以用两种等价的写法:
写法一:使用BETWEEN简化区间判断
WHERE (@year BETWEEN yearFrom AND yearTo) OR (yearFrom = @year AND yearTo IS NULL)
写法二:更直观的区间判断
WHERE (yearFrom <= @year AND yearTo >= @year) OR (yearFrom = @year AND yearTo IS NULL)
我们来验证这个条件对你示例数据的作用(传入@year=2010):
- 第一行
2009 | 2010:2009<=2010<=2010→ 命中(符合第一个条件) - 第二行
2005 | null:2005≠2010→ 不命中(两个条件都不满足) - 第三行
2010 | 2015:2010<=2010<=2015→ 命中(符合第一个条件) - 第四行
2015 | 2018:2015>2010→ 不命中 - 第五行
2010 | null:yearFrom=2010且yearTo=null→ 命中(符合第二个条件)
完全匹配你给出的hit/miss结果!
另外补充:如果你后续对yearTo为null的规则有调整(比如想表示yearFrom及以后的年份都算命中),只需把第二个条件改成yearTo IS NULL AND yearFrom <= @year即可,不过根据你当前的示例,上面的写法是完全正确的。
内容的提问来源于stack exchange,提问作者Website Builder
相关产品推荐
相关产品推荐

