Tsql 填写缺失的日期,添加默认数字

Tsql 填写缺失的日期,添加默认数字,tsql,Tsql,假设我们有下面的日期表,也假设今天是2012年1月13日: DateKey | AvailabilityPerc ----------------------------- 2012-01-01 | 79 2012-01-02 | 80 2012-01-03 | 85 2012-01-07 | 75 2012-01-09 | 90 脚本应该做两件事: 1.填写从2012年1月1日到三天前的缺失日期,即2012年1月10日当前日期减去三天。 2.仅对于新rown,在

假设我们有下面的日期表,也假设今天是2012年1月13日:

DateKey    | AvailabilityPerc  
-----------------------------
2012-01-01 | 79  
2012-01-02 | 80  
2012-01-03 | 85  
2012-01-07 | 75  
2012-01-09 | 90  
脚本应该做两件事: 1.填写从2012年1月1日到三天前的缺失日期,即2012年1月10日当前日期减去三天。 2.仅对于新rown,在AvailabilityPerc列中填入默认数字,例如100

生成的表应如下所示:

DateKey    |  AvailabilityPerc
-------------------------------
2012-01-01 | 79 
2012-01-02 | 80  
2012-01-03 | 85  
2012-01-04 | 100  
2012-01-05 | 100  
2012-01-06 | 100  
2012-01-07 | 75  
2012-01-08 | 100  
2012-01-09 | 90  
2012-01-10 | 100  
with temp as 
(
   select DateAdd(d, -5,GETDATE()) as d, 23 as val
   UNION
   select DateAdd(d, -3,GETDATE()), 44 as val
   UNION
   select DateAdd(d, -1,GETDATE()), 55 as val
), dates as
(
   SELECT MyDate = CONVERT(DATETIME,'01/01/2012'), 100 as val
   UNION ALL
   SELECT MyDate = DATEADD(D,1,MyDate), 100 as val
   from dates
   WHERE MyDate < DATEADD(D,-3,GETDATE())
)

SELECT d.MyDate, COALESCE(t.val, d.val) FROM dates d
LEFT JOIN temp t
ON Convert(varchar, d.MyDate, 101) = Convert(varchar, t.d, 101)
OPTION (MAXRECURSION  365)

非常感谢您在这方面提供的任何帮助。

尝试以下方式:

DateKey    |  AvailabilityPerc
-------------------------------
2012-01-01 | 79 
2012-01-02 | 80  
2012-01-03 | 85  
2012-01-04 | 100  
2012-01-05 | 100  
2012-01-06 | 100  
2012-01-07 | 75  
2012-01-08 | 100  
2012-01-09 | 90  
2012-01-10 | 100  
with temp as 
(
   select DateAdd(d, -5,GETDATE()) as d, 23 as val
   UNION
   select DateAdd(d, -3,GETDATE()), 44 as val
   UNION
   select DateAdd(d, -1,GETDATE()), 55 as val
), dates as
(
   SELECT MyDate = CONVERT(DATETIME,'01/01/2012'), 100 as val
   UNION ALL
   SELECT MyDate = DATEADD(D,1,MyDate), 100 as val
   from dates
   WHERE MyDate < DATEADD(D,-3,GETDATE())
)

SELECT d.MyDate, COALESCE(t.val, d.val) FROM dates d
LEFT JOIN temp t
ON Convert(varchar, d.MyDate, 101) = Convert(varchar, t.d, 101)
OPTION (MAXRECURSION  365)

谢谢你,阿贝。当我执行上述操作时,尽管它并不遵从val变量的临时表条目。它仅用100覆盖所有日期记录。此外,我更希望脚本实际使用我的表信息创建一个缺少日期和值的新表。我想这是因为datetime上的时间问题。我把连接改为只使用日期,试试看是否有效。干得好!一个问题消失了,最后一个问题。现在,脚本将替换临时数据,而不是val 100。但是,我希望直接从表中读取数据,而不是使用“temp”表条目将它们输入到脚本中。我的表在任何时间点都可能有超过200条记录,我需要动态地将其记录拉入脚本,而不是使用UNION函数创建记录。任何进一步的想法。谢谢用您的表名替换temp。日期将需要暂停工作。日期没有问题,但是今天的日期减去5、今天-3和今天-1的静态val条目(23、44和55)仍然保留在结果表中——情况不应该如此。只有原始表中的值应保留为结果表。不应通过代码输入任何值。