生成包含缺失值的完整日期范围
处理日期数据时,通常需要显示指定范围内的所有日期,即使某些日期的记录丢失。如何在 SQL 中实现此目的,确保缺失的日期在相关列中显示零值?
考虑下表 @temp,其中包含示例日期数据:
INSERT INTO @temp SELECT '10/2/2012', 1 INSERT INTO @temp SELECT '10/3/2012', 1 INSERT INTO @temp SELECT '10/5/2012', 1 INSERT INTO @temp SELECT '10/7/2012', 2 INSERT INTO @temp SELECT '10/9/2012', 2 INSERT INTO @temp SELECT '10/10/2012', 2 INSERT INTO @temp SELECT '10/13/2012', 2 INSERT INTO @temp SELECT '10/15/2012', 2
要检索两个给定日期之间的所有日期,您可以使用以下查询:
SELECT * FROM @temp WHERE CDate BETWEEN '10/01/2012' AND '10/15/2012'
但是,此查询只会返回该日期范围内的现有记录。要包含零值的缺失日期,您需要创建一个完整的日期范围并将其与现有数据连接:
;WITH d(date) AS ( SELECT CAST('10/01/2012' AS DATETIME) UNION ALL SELECT DATE + 1 FROM d WHERE DATE < '10/15/2012' ) SELECT t.ID, d.date CDate, ISNULL(t.val, 0) AS val FROM d LEFT JOIN temp t ON t.CDate = d.date ORDER BY d.date OPTION (MAXRECURSION 0) -- Use this if your dates are >99 days apart
MAXRECURSION 数字选项限制递归迭代的次数,确保查询成功完成。 ISNULL 函数将 val 列中的任何空值替换为零。
使用此方法,可以确保显示指定范围内的所有日期,缺失值用零表示。
以上是如何在 SQL 中生成完整的日期范围,包括缺失的零值日期?的详细内容。更多信息请关注PHP中文网其他相关文章!