2017-04-27 82 views
0

我有表像數據:設置結束時間,下一行的起始時間

Id | Start   | End   | Used 
---------------------------------------- 
1 | 27-04-17 2:00 |27-04-17 0:00 | 1:30 
--------------------------------------- 
2 | 27-04-17 2:00 |27-04-17 0:00 | 23:00 
--------------------------------------- 
3 | 27-04-17 2:00 |27-04-17 0:00 | 1:00 
--------------------------------------- 
4 | 28-04-17 2:00 |28-04-17 0:00 | 0:30 
--------------------------------------- 
5 | 30-04-17 2:00 |30-04-17 0:00 | 3:30 
--------------------------------------- 

我想設置它像

Id | Start   | End   | Used 
---------------------------------------- 
1 | 27-04-17 2:00 |27-04-17 3:30 | 1:30 
--------------------------------------- 
2 | 27-04-17 3:30 |28-04-17 2:30 | 23:00 
--------------------------------------- 
3 | 28-04-17 2:30 |28-04-17 3:30 | 1:00 
--------------------------------------- 
4 | 28-04-17 3:30 |28-04-17 4:00 | 0:30 
--------------------------------------- 
5 | 30-04-17 2:00 |30-04-17 4:30 | 2:30 
--------------------------------------- 

我想成立以前的結束時間id作爲下一個id的開始時間,其中第一個id的開始時間由用戶設置。
結束時間只是開始時間和使用時間的總和我正在使用vb.net數據表和數據庫的SQL服務器。
要在第一行中設置值,我正在使用SQL函數DATEADD(),通過它添加兩個小時,並在結束日期中添加相同的函數。
我想複製下一行上一行的結束日期,以便整個計算正常工作。
我可以通過SQL來完成嗎?或者我將需要一個函數在Vb.net數據表中執行它將用於報告的位置。
注意:Id序列可以更改
感謝您的幫助。

+1

如果你有一個像這樣的_database_表,你可以運行一個'UPDATE'語句。 –

+0

對不起,我不能這樣做,因爲記錄是爲了顯示的目的,所以永久性的改變是不可能的。它也會影響序列是否改變。 –

+0

這是它太寬。你需要顯示_you_已經嘗試了什麼。你想在數據庫或VB.NET中做這件事嗎?請看[問]。 – Bugs

回答

0

遞歸下面的CTE邏輯會給你想要的輸出。

create table #tmp 
(
ID int, 
starttime datetime2, 
endtime datetime2, 
used varchar(5) 
) 
insert into #tmp values 
(1,'17-Apr-2017 2:00','17-Apr-2017','1:30'), 
(2,'17-Apr-2017 2:00','17-Apr-2017','2:00'), 
(3,'17-Apr-2017 2:00','17-Apr-2017','1:00'), 
(4,'17-Apr-2017 2:00','17-Apr-2017','0:30'), 
(5,'28-Apr-2017 2:00','28-Apr-2017','3:30') 

;with CTE as (
select ID,starttime,endtime,used,levels FROM 
(select row_number() over (partition by cast(starttime as date) order by starttime) RID,ID,starttime,dateadd(hour,cast(substring(used,1,charindex(':',used)-1) as int),dateadd(mi,cast(right(used,2) as int),starttime)) 
endtime,used,0 levels 
from #tmp) T 
where RID=1 
union all 
select T.ID,C.endtime,dateadd(hour,cast(substring(T.used,1,charindex(':',T.used)-1) as int),dateadd(mi,cast(right(T.used,2) as int),C.endtime)) 
endtime,T.used,C.levels+1 
from CTE C inner join #tmp T on T.ID=C.ID+1 
where datediff(d,C.starttime,T.starttime)=0 
) 

select ID,StartTime,EndTime,Used from CTE order by ID 

drop table #tmp 
+0

你節省了我的一天:) –

+0

希望它適用於所有場景:) –

+0

對不起,它不工作在少數。就像id 5從4月28日開始一樣,由於CTE的開始日期被移回到17,這是前一個結束日期。 –

相關問題