Tsql 获取给定日期后连续50天内的日期

Tsql 获取给定日期后连续50天内的日期,tsql,Tsql,活动表: 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')

活动表:

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')
现在输入日期为2016年1月12日,id希望在2016年1月12日之后的50天内获取所有活动。查询应返回开始日期为2017年1月1日、2017年2月5日的活动,因为这是2017年1月31日和2017年4月1日之后的50天内

id 1的2017年8月1日和2017年9月1日不应选择8/1不在4/15的50天内,且50天周期被打破

TIA

OP说:

希望在2016年1月12日后的50天内完成所有活动

实现该结果的一个可能的查询是

-- get all activities with a begin_date within 50 days of input_date
select *
from #activity as a
where @input_date <= a.begin_date and a.begin_date < dateadd(day, 50, @input_date)
然而,OP接着说:

查询应返回开始日期为2017年1月1日、2017年2月5日的活动,因为这是2017年1月31日和2017年4月1日之后的50天内。id 1的2017年8月1日和2017年9月1日不应选择8/1不在4/15的50天内,且50天周期被打破

这表明您希望找到2016年12月1日之后开始的所有连续活动,其中连续活动之间的间隔小于50天

一种可能的方法是使用函数。如何在此问题上使用滞后函数的示例如下:

select
    a.*
    , lag(a.end_date, 1, @input_date) over (order by a.end_date) as previous_end
    , datediff(day, lag(a.end_date, 1, @input_date)  over (order by a.end_date), a.begin_date) as previous_end_to_this_begin
from #activity as a
where @input_date <= a.begin_date
order by a.begin_date
稍微简化会产生以下结果:

-- get all activities in a row where the gap between activities is less than 50
select * from #activity as a where @input_date <= a.begin_date and a.begin_date < (
select
    min(a.begin_date) as first_begin_to_not_include
from
    (
        select
            a.begin_date
            , datediff(day, lag(a.end_date, 1, @input_date)  over (order by a.end_date), a.begin_date) as previous_end_to_this_begin
        from #activity as a
        where @input_date <= a.begin_date
    ) as a
where a.previous_end_to_this_begin > 50
)
order by a.begin_date

您期望的结果是什么?很高兴您将示例数据发布为DDL+DML。然而,您的问题仍然需要预期的结果和您当前的尝试。请将您的问题包括在内。预期结果是:应返回开始日期为2017年1月1日、2017年2月5日的活动,因为这是在2017年1月31日和2017年4月1日的50天内。