如何编写SQL查询筛选日期范围与2017年有重叠的活动?
解决活动日期范围与2017年有交集的SQL查询问题
嘿,这个坑我之前踩过!你原来的写法只检查活动的开始或结束年份是否为2017,确实会漏掉那些跨年度的活动——比如从2016年跨到2018年的活动,它的开始和结束年份都不是2017,但整个时间段明显和2017年有重叠。
正确的思路应该是判断活动的日期范围和2017年的全年范围是否存在交集。两个时间段[StartDt, EndDt]和[2017-01-01, 2017-12-31]有交集的核心条件是:
- 活动的开始日期不晚于2017年的最后一天
- 活动的结束日期不早于2017年的第一天
用这个逻辑写出来的SQL可以覆盖所有符合要求的情况:
- 活动完全在2017年内
- 活动从2016年延续到2017年
- 活动从2017年延续到2018年
- 活动横跨2016-2018整个区间
通用SQL写法
SELECT * FROM Activities WHERE StartDt <= '2017-12-31' AND EndDt >= '2017-01-01';
更严谨的数据库适配写法(以SQL Server为例)
如果你的数据库支持日期构造函数,比如SQL Server的DATEFROMPARTS,可以用更灵活的方式避免硬编码日期字符串:
SELECT * FROM Activities WHERE StartDt <= DATEFROMPARTS(2017, 12, 31) AND EndDt >= DATEFROMPARTS(2017, 1, 1);
为什么原来的写法不行?
你之前用的datepart(yyyy, StartDt) = 2017 OR datepart(yyyy, EndDt) = 2017,只判断了单个日期的年份,但跨年度活动的StartDt年份是2016、EndDt年份是2018,两者都不满足等于2017的条件,自然就被错误地排除了。而时间段交集的判断逻辑,不管活动什么时候开始或结束,只要和2017年有哪怕一天的重叠,都会被筛选出来。
内容的提问来源于stack exchange,提问作者Crescent
相关产品推荐
相关产品推荐

