我想到的第一件事就是通过查看今年的日子来填补缺失的日期。您可以通过加入主数据库中的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,并从最小值开始添加日期。我会考虑更新我的帖子。 –