根据指定日期和ID查询连续50天内的Activity活动记录
没问题,我来帮你解决这个日期范围查询的需求,整理后的内容如下:
问题描述
现有一个临时表#activity,存储着用户的活动时间段数据,现在需要根据指定的日期(2016年12月1日)和ID,查询所有处于该日期起连续50天范围内的活动记录。
临时表结构与测试数据
首先是临时表的创建和数据插入语句:
create table #activity(id int, begin_date datetime, end_date datetime) insert into #activity values(1, '1/1/2017', '1/31/2017') insert into #activity values(1, '9/1/2017', '9/15/2017') insert into #activity values(1, '4/1/2017', '4/15/2017') insert into #activity values(1, '2/5/2017', '2/15/2017') insert into #activity values(1, '8/1/2017', '8/31/2017') Insert into #activity values(2, '11/1/2016', '11/15/2016')
核心思路
我们要筛选的是活动时间段与指定日期的50天窗口存在重叠的记录。这里的50天窗口是从2016-12-01到2017-01-19(因为起始日加49天就是第50天的结束)。
两个时间段相交的判断逻辑是:活动的开始日期 ≤ 窗口结束日期,并且活动的结束日期 ≥ 窗口开始日期,只要满足这个条件,就说明活动和目标窗口有重叠,需要被查询出来。
最终查询SQL
下面是可直接使用的查询语句,你可以替换@TargetId为实际需要查询的ID:
-- 定义目标日期和50天窗口的结束日期 DECLARE @TargetDate DATETIME = '2016-12-01' DECLARE @WindowEnd DATETIME = DATEADD(day, 49, @TargetDate) DECLARE @TargetId INT = 1 -- 替换为你要查询的ID SELECT id, begin_date, end_date FROM #activity WHERE id = @TargetId -- 判断活动时间段与50天窗口是否重叠 AND begin_date <= @WindowEnd AND end_date >= @TargetDate
举个例子:如果查询ID=1,那么只有2017年1月的活动会被选中(它的时间段和2016-12-01至2017-01-19的窗口有重叠);如果查询ID=2,它的活动在2016年11月,完全在窗口之外,所以不会返回任何结果。
内容的提问来源于stack exchange,提问作者blue pink
相关产品推荐
相关产品推荐

