2015-04-20 26 views
2

我試圖在我的表中創建兩個字段,顯示vid的時間是否與任何其他vid的時間衝突,以及哪個vid的衝突。SQL time in&time out在表012中的任何id之間衝突

示例數據:

SELECT vid, timein, timeout 
FROM mytable 

vid timein      timeout 
1 2015-04-15 06:00:00.000  2015-04-16 17:00:00.000 
2 2015-04-17 03:00:00.000  2015-04-17 18:00:00.000 
3 2015-04-16 16:00:00.000  2015-04-17 06:00:00.000 
4 2015-04-12 12:00:00.000  2015-04-12 22:00:00.000 
5 2015-03-25 01:00:00.000  null 

所需的輸出:

vid timein      timeout      Clash Clashwith 
1 2015-04-15 06:00:00.000  2015-04-16 17:00:00.000  CLASH 3 
2 2015-04-17 03:00:00.000  2015-04-17 18:00:00.000  CLASH 3 
3 2015-04-16 16:00:00.000  2015-04-17 06:00:00.000  CLASH 1, 2 
4 2015-04-12 12:00:00.000  2015-04-12 22:00:00.000  OK 
5 2015-03-25 01:00:00.000  null      OK 

我曾嘗試:

SELECT vid, timein, timeout, 
CASE WHEN (SELECT tin.timein 
      FROM mytable tin 
      WHERE tin.vid = mytable.vid 
      AND mytable.timeout IS NOT NULL) 
      BETWEEN mytable.timein AND mytable.timeout 
    THEN 'CLASH' 
    ELSE 'OK' 
    END AS inclash, 
CASE WHEN (SELECT tout.timeout 
      FROM mytable tout 
      WHERE tout.vid = mytable.vid 
      AND mytable.timeout IS NOT NULL) 
      BETWEEN mytable.timein AND mytable.timeout 
    THEN 'CLASH' 
    ELSE 'OK' 
    END AS outclash 
FROM mytable 

,因爲它給人一種衝突的所有結果,此項不工作,我也不知道如何獲得與列寫入衝突。

回答

3

你可以用一個簡單的apply()做,來連接所有衝突的ID,你可以使用XML的技巧:

select 
    t1.vid, 
    t1.[timein], 
    t1.[timeout], 
    case when c.Clashwith is not null then 'CLASH' else 'OK' end as Clash, 
    c.Clashwith 
from mytable as t1 
    outer apply (
     select 
      stuff(
       (
        select ',' + cast(t2.vid as nvarchar(max)) 
        from mytable as t2 
        where 
         t2.vid <> t1.vid and 
         t2.[timein] <= t1.[timeout] and 
         t2.[timeout] >= t1.[timein] 
        for xml path(''), type 
       ).value('.', 'nvarchar(max)') 
      ,1,1,'') as Clashwith 
    ) as c 

sql fiddle demo

+0

你確定嗎?它會給出與你的測試示例完全相同的輸出 –

+0

已編輯的答案顯示什麼對我有用 – Matt

+0

hey @Matt現在這個代碼是definetely不正確的,例如''或'部分不檢查自連接。我將再次檢查代碼,請嘗試找到一個代碼不工作的示例,我們將解決這個問題。 –