You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:33