SQL 查找缺失的日期范围

3
我有一个包含一整年中所有天数/月份的表格。
例如:
Day      Month
1         9
2         9
3         9
4         9
5         9
6         9
7         9
...       ...

我有一张表格,显示来自不同数据集的日期范围。
例如:
 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

如何比较这两个表格以显示在该特定月份数据集中缺失哪些日期。例如,对于上述示例中的数据集“webshop”,它缺少日期范围为2013年9月1日至2013年9月19日的数据。谢谢您的任何帮助!

DateRange 列的数据类型是什么? - huMpty duMpty
@huMptyduMpty,感谢您的帮助,现在是DATE - neeko
好的,那么您将在给定时间内检查一个月的缺失日期? - huMpty duMpty
@huMptyduMpty 是的,只是每次检查一个月。 - neeko
2个回答

10
您可以使用CTE并编写以下查询:

您可以使用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);

你是个天才!非常感谢 :) - neeko
啊,只有一个问题,我在同一张表中有不同的数据集和日期范围,有没有办法指定只检查“webshop”或任何其他数据集作为参数? - neeko
@neeko:加入where条件以过滤只包含“webshop”日期的数据。 - huMpty duMpty
@huMptyduMpty 再次感谢您的帮助,我猜这个应该放在第二个选择语句中? - neeko
1
根据这个答案,应该是类似于 SELECT DataSet,DateRange FROM ImportedDateRange WHERE DataSet='weblog' - huMpty duMpty
对于这样一个小序列,可能并不重要,但是仅供参考,使用递归CTE来生成顺序数据集可能是最低效的方法。 - GarethD

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接