生成缺少日期+ Sql Server(基于SET)

时间:2009-11-02 05:40:27

标签: sql sql-server tsql sql-server-2005 gaps-and-islands

我有以下

id eventid  startdate enddate

1 1     2009-01-03 2009-01-05
1 2     2009-01-05 2009-01-09
1 3     2009-01-12 2009-01-15

如何生成与每个偶数相关的缺失日期?

编辑: 缺少的差距将根据eventid来找出。例如对于eventid 1,输出应该是1/3 / 2009,1 / 4 / 2009,1 / 5/2009 ..对于eventtype id 2它将是1/5/2009,1 / 6/2009 ...到1 / 9/2009等

我的任务是找出两个给定日期之间的缺失日期。

这是我到目前为止所做的全部事情

declare @tblRegistration table(id int primary key,startdate date,enddate date)
insert into @tblRegistration 
        select 1,'1/1/2009','1/15/2009'
declare @tblEvent table(id int,eventid int primary key,startdate date,enddate date)
insert into @tblEvent 
        select 1,1,'1/3/2009','1/5/2009' union all
        select 1,2,'1/5/2009','1/9/2009' union all
        select 1,3,'1/12/2009','1/15/2009'

;with generateCalender_cte as
(
    select cast((select  startdate from @tblRegistration where id = 1 )as datetime) DateValue
       union all
        select DateValue + 1
        from    generateCalender_cte   
        where   DateValue + 1 <= (select enddate from @tblRegistration where id = 1)
)
select DateValue as missingdates from generateCalender_cte
where DateValue not between '1/3/2009' and '1/5/2009'
and DateValue not between '1/5/2009' and '1/9/2009'
and DateValue not between '1/12/2009'and'1/15/2009'

其实我要做的是,我已经生成了一个日历表,并从那里我试图找出基于id的

的缺失日期

理想的输出将是

eventid                    missingdates

1             2009-01-01 00:00:00.000

1             2009-01-02 00:00:00.000

3             2009-01-10 00:00:00.000

3            2009-01-11 00:00:00.000

并且它必须在SET BASED中,并且开始和结束日期不应该是硬编码的

感谢adavnce

2 个答案:

答案 0 :(得分:3)

以下使用递归CTE(SQL Server 2005 +):

WITH dates AS (
     SELECT CAST('2009-01-01' AS DATETIME) 'date'
     UNION ALL
     SELECT DATEADD(dd, 1, t.date) 
       FROM dates t
      WHERE DATEADD(dd, 1, t.date) <= '2009-02-01')
SELECT t.eventid, d.date
  FROM dates d 
  JOIN TABLE t ON d.date BETWEEN t.startdate AND t.enddate

它使用DATEADD函数生成日期。它可以改为开始&amp;结束日期作为参数。根据{{​​3}},它比使用数字表技巧更快。

答案 1 :(得分:1)

与rexem一样 - 我创建了一个包含类似CTE的函数来生成所需的任何日期时间间隔系列。非常方便按日期时间间隔汇总数据,就像您正在做的那样。 更详细的帖子和功能源代码在这里:

Insert Dates in the return from a query where there is none

一旦你有“按日期计算的事件数量”......你的缺席日期将是计数为0的日期。