如何获取在开始和停止日期时间(SQL)期间间隔内发生的活动状态(t-SQL)

如何获取在开始和停止日期时间(SQL)期间间隔内发生的活动状态(t-SQL),sql,sql-server,tsql,Sql,Sql Server,Tsql,我想查询以下场景。 我有一个包含事件和发生时间的表,如下所示: EventName OccuredAtDatetime EventA 2019-07-03 00:14:01 EventA 2019-07-03 01:14:01 EventA 2019-07-03 01:34:01 EventB 2019-07-03 01:13:03 我想知道在本例中,事件是否在30分钟的时间间隔内发生,比如开始时间为2019-07-03 00:0

我想查询以下场景。 我有一个包含事件和发生时间的表,如下所示:

EventName     OccuredAtDatetime
EventA        2019-07-03 00:14:01
EventA        2019-07-03 01:14:01
EventA        2019-07-03 01:34:01
EventB        2019-07-03 01:13:03
我想知道在本例中,事件是否在30分钟的时间间隔内发生,比如开始时间为2019-07-03 00:00:00,结束时间为2019-07-03 02:00:00,时间间隔如下

IntervalName     StartTime                EndTime
Interval1       2019-07-03 00:00:00       2019-07-03 00:30:00
Interval2       2019-07-03 00:30:00       2019-07-03 01:00:00
Interval3       2019-07-03 01:00:00       2019-07-03 01:30:00
Interval4       2019-07-03 01:30:00       2019-07-03 02:00:00

所以,输出会是这样的

EventName     Interval1    Interval2       Interval3        Interval4
EventA        Yes          No              Yes              Yes
EventB        No           No              Yes              No


这也是我关于stackoverflow的第一篇文章,所以如果数据不是首选格式,或者有任何其他问题,请告诉我。谢谢

假设您的表被称为事件和间隔,这将:

with cte as (
select e.EventName,
    i.IntervalName
from Events as e
    cross apply Intervals as i 
where e.OccuredAtDatetime>= i.StartTime
  and e.OccuredAtDatetime < i.EndTime
)
select  e.EventName,
        max(IIF(c.IntervalName='Interval1','Yes','No')) as Interval1,
        max(IIF(c.IntervalName='Interval2','Yes','No')) as Interval2,
        max(IIF(c.IntervalName='Interval3','Yes','No')) as Interval3,
        max(IIF(c.IntervalName='Interval4','Yes','No')) as Interval4
from events as e
    left outer join cte as c ON e.EventName = c.EventName
group by e.EventName

基本上,cte会查找所有发生的实例,第二个选择只是根据您的要求进行格式化。

您可以通过执行动态SQL查询来实现这一点

质疑


实际上,我只有一张事件表。间隔表应根据15分钟、30分钟、1小时等间隔自动创建。感谢您首先需要数字表,请参见示例。接下来,您需要动态透视,这里有很多答案,因为输出列的数量在变化。这正是我想要的。输出现在有动态列。G8@AshishBhagasra如果这正是您要查找的内容,请单击左侧的复选标记接受答案。这是本网站所期待的礼仪。
declare @sql as varchar(max);
select @sql = 'select [t1].[EventName], ' + stuff((
        select ', max(case when [IntervalName] = ' + char(39) + [IntervalName] + char(39)
        + ' and [t1].OccuredAtDatetime between [t2].[StartTime] and [t2].[EndTime] then '
        + char(39) + 'Yes' + char(39) + ' else ' + char(39) + 'No' + char(39) 
        + ' end) as [' + [IntervalName] + ']'
        from [intervals]
        for xml path('')
    ),
    1, 1, ''
)
+ ' from [events] as [t1], [intervals] as [t2]'
+ ' group by [t1].[EventName];';

exec(@sql);