2013-12-19 314 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