2014-05-14 20 views
0

我有一個表:時間SQL代碼overlaping

--------------------------------------------------- 
    *************************************************** 
    worker | job | starttime  | endtime 
    --------------------------------------------------- 
    w1  | j1 | 2014-01-02 08:00 | 2014-01-02 10:00 
    --------------------------------------------------- 
    w1  | j2 | 2014-01-02 08:00 | 2014-01-02 11:00 
    --------------------------------------------------- 
    w1  | j3 | 2014-01-02 09:00 | 2014-01-02 12:00 
    --------------------------------------------------- 
    w1  | j4 | 2014-01-02 12:00 | 2014-01-02 13:00 
--------------------------------------------------- 
    w1  | j1 | 2014-01-02 12:00 | 2014-01-02 13:00 

我想要的結果作爲

W1的J1爲2小時
W1的J2是1小時
w1的j3是1小時其等額外的時間
W1的J4是1小時

例如,當製備在相同的時間,但塗層蛋蛋糕,塗層麪粉和雞蛋需要較長的時間。
找到總時間很簡單,但我該如何區分它們?
是否有可能在sql代碼?

+0

我不確定你的問題實際上是什麼。如果你只是想從J1的結束時間中減去J2的結束時間,那麼這是可能的 - 但如果不是,那麼我不知道你在做什麼? –

+4

爲什麼'j1'2小時和'j2'1小時而不是'j1'爲0小時而'j2'爲3小時?換句話說,工作的順序非常重要,您可以想象更復雜的情況,答案不明顯。如果你總是隻有兩份工作,那麼答案很簡單。有了更多的答案,對於一套直觀的規則來說,答案甚至可能不是很明確。 –

回答

0

看一看DATEDIFF

返回指定的日期部分 邊界指定的開始日期和結束日期之間交叉的次數(有符號整數)。 (這也適用於timeparts)

select worker,job, DATEDIFF(HOUR,endtime,starttime) as diff from mytable 
+0

與我的問題有什麼關係?我不明白。請解釋。 – user3222643

0

我編輯我的答案來處理情況,結束時間等於先前的結束時間的情況下。

所以這裏就像你想要的東西。我們以最大結束時間,其中

  • 工作是不是當前和
  • 結束時間小於當前行的結束時間
  • 和比較,當前行的結束時間,以確定多長時間當前行擴展了以前的工作。

如果該響應爲空,該行是作業中的第一行,在這種情況下,我們只是使用開始和結束之間的差異。

如果結束時間等於上一個結束時間,由於row_number在結束時間上劃分時大於1,因此我們輸出零作爲時間,因爲這是該行與前一個行之間的差。

請注意,「時間」數據類型限於24小時,因此它可能不是輸出的適當數據類型。我只是用它,因爲它在例子中爲時間產生了很好的結果。

declare @times table (
    rowId int identity, 
    worker varchar(10), 
    job varchar(10), 
    starttime datetime, 
    endtime datetime 
) 

insert into @times (worker,job,starttime,endtime) 
     select 'w1','j1','2014-01-02 08:00','2014-01-02 9:25' 
union select 'w1','j2','2014-01-02 08:00','2014-01-02 11:00' 
union select 'w1','j3','2014-01-02 09:00','2014-01-02 12:00' 
union select 'w1','j4','2014-01-02 12:00','2014-01-02 14:22' 
union select 'w1','j5','2014-01-02 12:00','2014-01-02 14:22' 

select *, 
    case when 
     ROW_NUMBER() over (partition by endtime order by starttime,endtime) > 1 then cast('0:00' as time) 
    else 
     coalesce(
      cast((endtime - (select max(endtime) from @times where endtime < t.endtime)) as time), 
      cast((endtime - starttime) as time) 
     ) 
    end as differential3 
from @times t 
+0

我編輯了我的問題。請再次查看。你的方式似乎是正確的,但缺少一些東西。謝謝你的回覆。 – user3222643