Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL插入其他行_Tsql_Sql Server 2008 R2 - Fatal编程技术网

TSQL插入其他行

TSQL插入其他行,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,对于以下问题,识别和插入行的最有效方法是什么 这是我的样本数据 vId StartDate EndDate Distance ------------------------------------ 256 2015-03-04 2015-03-05 365 271 2015-03-04 2015-03-04 86 315 2015-03-05 2015-03-06 254 256 2015-03-07 2015-03-09 150 458 2015-03-1

对于以下问题,识别和插入行的最有效方法是什么

这是我的样本数据

vId StartDate   EndDate     Distance
------------------------------------    
256 2015-03-04  2015-03-05  365
271 2015-03-04  2015-03-04  86
315 2015-03-05  2015-03-06  254
256 2015-03-07  2015-03-09  150
458 2015-03-10  2015-03-12  141
458 2015-03-15  2015-03-17  85
315 2015-03-15  2015-03-16  76
我想为每个vId添加额外的行,其中StartDate-EndDate如下所示,所以不只是

315 2015-03-05  2015-03-06  254
256 2015-03-07  2015-03-09  150
我想展示以下几点

315 2015-03-05  2015-03-06  254
315 2015-03-06  2015-03-06  0

256 2015-03-07  2015-03-09  150
256 2015-03-08  2015-03-09  0
256 2015-03-09  2015-03-09  0
提前感谢。

只需简单插入:

Insert Into Table(vId, StartDate, EndDate, Distance)
Select vId, DateAdd(dd, 1, StartDate), EndDate, 0
From TableName
Where StartDate <> EndDate
如果只需选择而不插入,则:

Select vId, StartDate, EndDate, Distance
From TableName

Union All

Select vId, DateAdd(dd, 1, StartDate), EndDate, 0
From TableName
Where StartDate <> EndDate
编辑

这假设存在最大100天的差异。如果间隔较长,可以添加更多交叉连接以增加可能的值:

declare @t table(vId int, StartDate date, EndDate date, Distance int)

insert into @t values
(315, '2015-03-05',  '2015-03-06',  254),
(256, '2015-03-07',  '2015-03-09',  150)


;with cte as(select row_number() over(order by (select 1)) as rn
             from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n)
             cross join (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n)
            )

select * from @t
union all
select t1.vId, ca.StartDate, t1.EndDate, 0 
from @t t1
cross apply(select dateadd(dd, c.rn, StartDate) as StartDate 
            from cte c 
            where dateadd(dd, c.rn, t1.StartDate) <= t1.EndDate) as ca
where t1.StartDate <> t1.EndDate
order by vId, StartDate

请参阅fiddle,当开始日期和结束日期之间的差异仅为1天时,它似乎工作正常。我有几行的差异超过一天。如果是问题,我不理解这个问题。我更新了问题以清楚地解释这一点。以下各项的差异为2天256 2015-03-07 2015-03-09 150。所以我需要另外两排。谢谢,这对我很有帮助