当前位置: 首页 > 面试题库 >

如何在SQL Server中合并时间间隔

步博艺
2023-03-14
问题内容

假设我有以下内容的事件表personIdstartDateendDate

我想知道X人花了多少时间做一个事件(事件可以互相覆盖)。

如果此人只有1个事件,则很简单: datediff(dd, startDate, endDate)

如果此人有2个事件,那将很棘手。

我将为预期的结果设置一些方案。

场景1

startDate endDate
1         4
3         5

这意味着他的结果应该是从1到5的datediff

方案2

startDate endDate
1         3
6         9

这意味着他的结果应该是一些datediff(dd,1,3)datediff(dd,6,9)

如何在sql查询中获得此结果?我只能想到一堆if语句,但是同一个人可以有n个事件,因此查询确实会造成混乱。

碎纸机编辑: 我想添加第三个方案:

startDate endDate
1       5
4       8
11      15

碎纸机方案所需的结果:

(1,5)和(4,8)在(1,8)中合并,因为它们重叠,那么我们需要datediff(1,8) + datediff(11,15)=> 7 + 4 =>
11


问题答案:

您可以使用递归CTE构建日期列表,然后计算不同的日期。

declare @T table
(
  startDate date,
  endDate date
);

insert into @T values
('2011-01-01', '2011-01-05'),
('2011-01-04', '2011-01-08'),
('2011-01-11', '2011-01-15');

with C as
(
  select startDate,
         endDate
  from @T
  union all
  select dateadd(day, 1, startDate),
         endDate
  from C
  where dateadd(day, 1, startDate) < endDate       
)
select count(distinct startDate) as DayCount
from C
option (MAXRECURSION 0)

结果:

DayCount
-----------
11

或者,您可以使用数字表。在这里我使用master..spt_values:

declare @MinStartDate date
select @MinStartDate = min(startDate)
from @T

select count(distinct N.number)
from @T as T
  inner join master..spt_values as N
    on dateadd(day, N.Number, @MinStartDate) between T.startDate and dateadd(day, -1, T.endDate)
where N.type = 'P'


 类似资料:
  • 我有很多海面温度NetCDF文件,具有相同的纬度和纬度,但时间变量不同。我想尝试通过组合时间变量将其组合成一个NetCDF文件,因为每个NetCDF文件中的时间变量是连续的 有没有更有效的方法?因为在CDO(气候数据操作员)中,我无法进行循环 下面是我使用的文件名的一个例子 带模式sstdas_(年)(月)(dekad)

  • 让我们以合并排序的实现为例 a) 这种合并排序的时间复杂度是。并行化(1)和(2)会带来实际收益吗?从理论上讲,在对它们进行并行化之后,似乎最终也会出现。但实际上我们能得到什么好处吗? b) 这种合并排序的空间复杂度是。但是,如果我选择使用链表执行就地合并排序(不确定是否可以合理地使用数组),空间复杂性是否会变得,因为您必须考虑递归堆栈帧大小?既然它不能超过64,我们能把当作常数吗?我可能在几个地

  • 问题内容: 从选择查询的开始时间和结束时间列表中,我需要找出不包括重叠时间和休息时间的总时间。 因此,在这种情况下,总计应为160分钟。 我不想使用太多循环来解决这个问题。寻找一些简单的解决方案。 问题答案: 结果是160

  • 从flink办公室引入会话窗口 https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/windows.html#session-窗口。。。会话窗口操作符为每个到达的记录创建一个新窗口,如果窗口之间的距离比定义的间隙更近,则将窗口合并在一起。为了可合并,会话窗口操作符需要合并触发器和合并窗口函数,。。。

  • 问题内容: 问题:给定一组任意时间间隔的时间,将所有重叠的时间间隔合并为一个,然后输出结果,该结果应该只有互斥的时间间隔。为了简单起见,将间隔表示为整数对。例如,让给定的间隔集为{{1,3},{2,4},{5,7},{6,8}}。间隔{1,3}和{2,4}彼此重叠,因此应将它们合并并成为{1,4}。同样,{5,7}和{6,8}应该合并并成为{5,8} 编写一个函数,该函数为给定间隔集生成合并间隔集

  • 问题内容: 我想实现 .NET的时间段库中 提供的类似功能,但要实现SQL中的类似功能。 首先,我有一个表,其中有几行带有开始日期和结束日期, 我想像这样将它们合并在一起: 组合 然后,根据该结果和另一个来自不同表的结果,我想 找出它们两者之间的交集,像这样,但是只有2个输入 (找到两个中都存在的周期): 路口 一旦我有了交叉路口,便只是在上面总结时间。 在这里,我通过示例提供了一个SQL Fid