我想到的第一件事就是通過查看今年的日子來填補缺失的日期。您可以通過加入主數據庫中的spt_values表並將該數字添加到一年中的第一天來完成此操作。
DECLARE @Table AS TABLE(ADate Date, ANumber Int);
INSERT INTO @Table
VALUES
('2013-11-01',12),
('2013-11-12',15),
('2013-11-21',13),
('2013-12-01',0);
SELECT
DateAdd(D, v.number, MinDate) Date
FROM (SELECT number FROM master.dbo.spt_values WHERE name IS NULL) v
INNER JOIN (
SELECT
Min(ADate) MinDate
,DateDiff(D, Min(ADate), Max(ADate)) DaysInSpan
,Year(Min(ADate)) StartYear
FROM @Table
) dates ON v.number BETWEEN 0 AND DaysInSpan - 1
接下來我想包,爲了使派生表,並添加一個子查詢,以獲得最新的數字。你最終的結果可能是這個樣子:
DECLARE @Table AS TABLE(ADate Date, ANumber Int);
INSERT INTO @Table
VALUES
('2013-11-01',12),
('2013-11-12',15),
('2013-11-21',13),
('2013-12-01',0);
-- Uncomment the following line to see how it behaves when the date range spans a year end
--UPDATE @Table SET ADate = DateAdd(d, 45, ADate)
SELECT
AllDates.Date
,(SELECT TOP 1 ANumber FROM @Table t WHERE t.ADate <= AllDates.Date ORDER BY ADate DESC)
FROM (
SELECT
DateAdd(D, v.number, MinDate) Date
FROM
(SELECT number FROM master.dbo.spt_values WHERE name IS NULL) v
INNER JOIN (
SELECT
Min(ADate) MinDate
,DateDiff(D, Min(ADate), Max(ADate)) DaysInSpan
,Year(Min(ADate)) StartYear
FROM @Table
) dates ON v.number BETWEEN 0 AND DaysInSpan - 1
) AllDates
我是能夠使這項工作對我的需要。謝謝! – DarLom
當你看一個日期範圍「15/12/2012」到「14/01/2013」時會發生什麼? – bendataclear
@ben很有意思。根據權利,它應該在最大和最小日期上進行DateDiff,並從最小值開始添加日期。我會考慮更新我的帖子。 –