使用sql server显示不在数据库中的日期

时间:2013-09-03 12:47:56

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

我正在尝试在两个日期之间获取日期列表。

我在数据库中的日期是“2013-01-01”到“2013-01-31”,但缺少25,27,28个日期。

现在假设我通过了开始日期='2013-01-01'和结束日期='2013-01-31'来获取数据库中缺少日期的列表,即25,27,28个日期。

输出结果应如下:

2013年1月25日, 2013年1月27日, 2013年1月28日

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2005+,则可以尝试使用类似

的内容
DECLARE @StartDate DATETIME = '01 Jan 2013',
@EndDate DATETIME = '31 Jan 2013'

;With Dates AS (
    SELECT @StartDate RunDate
    UNION ALL
    SELECT RunDate + 1
    FROM Dates
    WHERE RunDate + 1 <= @EndDate
)
SELECT * 
FROM Dates d LEFT JOIN
    YourTable yt ON d.RunDate = yt.YourDate
WHERE yt.YourDate IS NULL
OPTION (MaxRecursion 0)

在这个查询中,我们使用递归CTE来生成日期序列(OPTION (MaxRecursion 0)是为了确保你没有收到递归错误),然后我们加入到有问题的表中,并且只有返回该表中缺少的值。