【发布时间】:2013-03-04 21:16:03
【问题描述】:
鉴于以下示例查询,如果还给出了一组要排除的范围,考虑到这些范围可能有重叠的日期,那么计算一个日期范围内的总天数的合理且高效的方法是什么?
更简单地说,我有一个表格,其中包含一组关闭计费的日期范围,我从一个日期范围(例如 Jan1 - Jan31)开始,我需要确定在该范围内发生了多少计费天。只需将日期的日期差异减去禁用日期的日期差异的总和。但是,禁用日期范围有可能重叠,即在一条记录中禁用 Jan5-Jan8,在另一条记录中禁用 Jan7-Jan10 - 因此简单的总和会使 Jan7 加倍。排除这些重叠并获得准确计数的最佳方法是什么。
Declare @disableranges table (disableFrom datetime, disableTo datetime)
insert into @disableranges
select '01/05/2013', '01/08/2013' union
select '01/07/2013', '01/10/2013' union
select '01/15/2013', '01/20/2013'
declare @fromDate datetime = '01/01/2013'
declare @toDate datetime = '01/31/2013'
declare @totalDays int = DATEDIFF(day,@fromDate,@toDate)
declare @disabledDays int = (0 /*not sure best way to calc this*/)
select @totalDays - @disabledDays
【问题讨论】:
-
禁用范围是否包含在内?即,
01/05/2013到01/08/2013会算作3天还是4?默认情况下,简单地调用DATEDIFF将包括开始日期,但不包括结束日期,因为默认时间值为0:00:00(午夜)。 -
在我看来它会算作 3
-
只有你知道它应该是什么:)。关键是当您说禁用范围为
01/05/2013到01/08/2013时,是否意味着8th也包括在内? -
不,就我而言,第二个日期是“禁用”的时间,这意味着该日期不再禁用。所以第 8 个不算。
标签: sql-server tsql