如何获取在开始和停止日期时间(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);