產生包含缺失值的完整日期範圍
處理日期資料時,通常需要顯示指定範圍內的所有日期,即使某些日期的記錄遺失。如何在 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中文網其他相關文章!