2013-12-19 157 views
3

我有一张表,包含全年的所有日/月SQL查找缺失的日期范围

E.G.

Day  Month 
1   9 
2   9 
3   9 
4   9 
5   9 
6   9 
7   9 
...  ... 

我有一个表,其示出了从不同的数据集

E.G.日期范围

DataSet DateRange 
webshop 2013-09-20 
webshop 2013-09-21 
webshop 2013-09-22 
webshop 2013-09-23 
webshop 2013-09-24 
webshop 2013-09-25 
webshop 2013-09-26 
webshop 2013-09-27 
webshop 2013-09-28 
webshop 2013-09-29 
webshop 2013-09-30 

我如何比较这两个表显示哪些天从DataSet缺少特定月份

E.G.对于我上面的例子数据集是webshop它缺少日期范围01/09/2013 - 19/09/2013

感谢您的任何帮助!

+0

什么是数据类型* DateRange *列? –

+0

@huMptyduMpty感谢您的帮助,这是'DATE' – neeko

+0

好吧,所以您要在给定的时间检查一个月的缺失日期? –

回答

7

您可以使用CTE和编写一个查询:

declare @StartDate DATE, @EndDate DATE 
set @StartDate = '2013-09-01'; 
set @EndDate = '2013-09-30'; 

    WITH DateRange(Date) AS 
    (
     SELECT 
      @StartDate Date 
     UNION ALL 
     SELECT 
      DATEADD(day, 1, Date) Date 
     FROM 
      DateRange 
     WHERE 
      Date < @EndDate 
    ) 

    SELECT 'webshop',Date 
    FROM DateRange 
    EXCEPT 
    SELECT DataSet,DateRange 
    FROM ImportedDateRange 
    WHERE DataSet='webshop' 
    --You could remove Maximum Recursion level constraint by specifying a MaxRecusion of zero 
    OPTION (MaxRecursion 10000); 
+0

你是一个天才!非常感谢:) – neeko

+0

啊,只有一个查询,我有不同的数据集,在同一个表中的日期范围,有没有什么方法可以指定只检查'webshop'或任何其他数据集作为参数? – neeko

+0

@neeko:把条件过滤只* *网上商店*日期 –

2

如果主表是

#Temp(Title varchar(10),DateRange date) 

你可以做喜欢的事,像

CREATE TABLE #ALLDATE(Date1 date) 
DECLARE @startDate DATE='9/1/2013' 
DECLARE @endDate DATE='9/30/2013' 

insert into #ALLDATE 
SELECT [Date] = DATEADD(Day,Number,@startDate) 
FROM master..spt_values 
WHERE Type='P' 
AND DATEADD(day,Number,@startDate) <= @endDate 


select 'webshop',Date1 
from #ALLDATE 
where Date1 not in 
     (select DateRange from #Temp where Title='webshop' and MONTH(GETDATE())=9) 
+1

+1不使用循环来生成日期。 – GarethD