需要知道如何在相应字段
中添加缺少空数据的日期**05/28/2012 NULL
05/29/2012 NULL
05/30/2012 NULL
05/30/2012 Break In
05/30/2012 Break Out
05/31/2012 NULL**
06/03/2012 NULL
06/03/2012 Break In
06/03/2012 Break Out
06/03/2012 In Duty
06/03/2012 Out Duty
06/04/2012 NULL
06/04/2012 In Duty
06/04/2012 Out Duty
06/05/2012 NULL
06/05/2012 Break In
06/05/2012 Break Out
06/06/2012 NULL
06/06/2012 Break In
06/06/2012 Break Out
06/06/2012 In Duty
06/06/2012 Out Duty
06/07/2012 NULL
06/07/2012 In Duty
06/07/2012 Out Duty
06/10/2012 NULL
06/10/2012 Break Out
06/10/2012 In Duty
06/10/2012 Out Duty
06/11/2012 NULL
06/11/2012 In Duty
06/11/2012 Out Duty
06/12/2012 NULL
06/13/2012 NULL
06/14/2012 NULL
我需要的结果是:
05/28/2012 NULL
05/29/2012 NULL
05/30/2012 NULL
05/30/2012 Break In
05/30/2012 Break Out
05/31/2012 NULL
06/01/2012 null
06/02/2012 null
06/03/2012 NULL
06/03/2012 Break In
06/03/2012 Break Out
06/03/2012 In Duty
06/03/2012 Out Duty
06/04/2012 NULL
06/04/2012 In Duty
06/04/2012 Out Duty
06/05/2012 NULL
06/05/2012 Break In
06/05/2012 Break Out
06/06/2012 NULL
06/06/2012 Break In
06/06/2012 Break Out
06/06/2012 In Duty
06/06/2012 Out Duty
06/07/2012 NULL
06/07/2012 In Duty
06/07/2012 Out Duty
06/08/2012 null
06/09/2012 null
06/10/2012 NULL
06/10/2012 Break Out
06/10/2012 In Duty
06/10/2012 Out Duty
06/11/2012 NULL
06/11/2012 In Duty
06/11/2012 Out Duty
06/12/2012 NULL
06/13/2012 NULL
06/14/2012 NULL
答案 0 :(得分:3)
最佳选择是保留一个日历表,其中包含您想要计算的若干年的所有日期,然后保持与该表的连接
select date,col1
from calender_table c
left join
your_table t
on c.[date]=t.[date]
您可以非常轻松地创建日历表。网上有很多脚本。 click for examples
答案 1 :(得分:2)
Declare @stDate datetime='05/28/2012'
declare @eddate datetime='06/14/2012'
select DATEADD(day,number,@stdate) from master..spt_values where type='P'
and DATEADD(day,number,@stdate) <= @eddate
此处只需将此结果与日期列上的表格结合即可获取缺少的日期
答案 2 :(得分:2)
形成一个带有开始和结束日期范围的日期日历,并与您的表格进行左连接以获得所需的结果。
e.g。
DECLARE @t TABLE(Dt Datetime, Value VARCHAR(20) NULL)
INSERT INTO @t VALUES
('05/28/2012',NULL),
('05/29/2012',NULL),
('05/30/2012',NULL),('05/30/2012','Break In'),('05/30/2012','Break Out'),
('05/31/2012',NULL),
('06/03/2012',NULL),('06/03/2012','Break In'),('06/03/2012','Break Out'),('06/03/2012','In Duty'),('06/03/2012','Out Duty'),
('06/04/2012',NULL),('06/04/2012','In Duty'),('06/04/2012','Out Duty'),
('06/05/2012',NULL),('06/05/2012','Break In'),('06/05/2012','Break Out'),
('06/06/2012',NULL),('06/06/2012','Break In'),('06/06/2012','Break Out'),('06/06/2012','In Duty'),('06/06/2012','Out Duty'),
('06/07/2012',NULL),('06/07/2012','In Duty'),('06/07/2012','Out Duty'),
('06/10/2012',NULL),('06/10/2012','Break Out'),('06/10/2012','In Duty'),('06/10/2012','Out Duty'),
('06/11/2012',NULL),('06/11/2012','In Duty'),('06/11/2012','Out Duty'),
('06/12/2012',NULL),
('06/13/2012',NULL),
('06/14/2012',NULL)
DECLARE @startDate DATETIME, @endDate DATETIME
SELECT @startDate = '2012-05-28', @endDate = '2012-06-14' --yyyy-mm-dd
;WITH Calender AS (
SELECT @startDate AS CalanderDate
UNION ALL
SELECT CalanderDate + 1 FROM Calender
WHERE CalanderDate + 1 <= @endDate
)
SELECT
[Date] = Convert(VARCHAR(10),CalanderDate,101)
,Value
FROM Calender c
LEFT JOIN @t t
ON t.Dt = c.CalanderDate
<强>结果强>
Date Value
05/28/2012 NULL
05/29/2012 NULL
05/30/2012 NULL
05/30/2012 Break In
05/30/2012 Break Out
05/31/2012 NULL
06/01/2012 NULL
06/02/2012 NULL
06/03/2012 NULL
06/03/2012 Break In
06/03/2012 Break Out
06/03/2012 In Duty
06/03/2012 Out Duty
06/04/2012 NULL
06/04/2012 In Duty
06/04/2012 Out Duty
06/05/2012 NULL
06/05/2012 Break In
06/05/2012 Break Out
06/06/2012 NULL
06/06/2012 Break In
06/06/2012 Break Out
06/06/2012 In Duty
06/06/2012 Out Duty
06/07/2012 NULL
06/07/2012 In Duty
06/07/2012 Out Duty
06/08/2012 NULL
06/09/2012 NULL
06/10/2012 NULL
06/10/2012 Break Out
06/10/2012 In Duty
06/10/2012 Out Duty
06/11/2012 NULL
06/11/2012 In Duty
06/11/2012 Out Duty
06/12/2012 NULL
06/13/2012 NULL
06/14/2012 NULL
希望这有帮助