SQL查找日期是否在范围内

SQL查找日期是否在范围内,sql,date,Sql,Date,使用tsql,我试图找出一个成员在30天的窗口内是否有来自三个独立bucket的服务。桶不一定持有唯一的值。在我下面的示例中,成员1没有在窗口中显示所有三个日期,而成员2有 create table #dates ( member tinyint, bucket tinyint, dt date ); insert into #dates (member,bucket,dt) values (1,1,'20170101'), (1,2,'2

使用tsql,我试图找出一个成员在30天的窗口内是否有来自三个独立bucket的服务。桶不一定持有唯一的值。在我下面的示例中,成员1没有在窗口中显示所有三个日期,而成员2有

create table #dates (
    member tinyint,
    bucket tinyint,
    dt date
);

insert into #dates (member,bucket,dt)
    values (1,1,'20170101'),
           (1,2,'20161225'),
           (1,2,'20170204'),
           (1,3,'20170129'),
           (2,1,'20170101'),
           (2,2,'20170102'),
           (2,3,'20161231');
初始查询

select *
from #dates d1 join
     #dates d2
     on d2.member=d1.member and d2.bucket=2 and
        d2.dt between DATEADD(DAY,-30,d1.dt) and DATEADD(day,30,d1.dt)
where d1.bucket=1

如果您希望成员符合此条件,则有一种方法:

select distinct d.member
from #dates d 
where exists (select 1
              from #dates d1
              where d1.member = d.member and d1.bucket = 1 and
                    d1.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt)
             ) and
      exists (select 1
              from #dates d2
              where d2.member = d.member and d2.bucket = 2 and
                    d2.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt)
             ) and
      exists (select 1
              from #dates d3
              where d3.member = d.member and d3.bucket = 3 and
                    d3.dt between DATEADD(DAY, -30, d.dt) and DATEADD(day, 30, d.dt)
             ) ;
成员1有两个#2桶,这是故意的吗?另外,您认为输出表将如何显示?每个成员一行,带指示符字段?