2016-07-25 82 views
0

我有一個表作爲測試差是給不正確的結果

shiftend   |  out   |  
--------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | 
16:00:00.0000000 | 2016-07-22 16:06:00 |  

Shiftend是有一個數據類型爲時間 出來是有一個數據類型爲SMALLDATETIME

我期待輸出作爲

shiftend   |   out   | Output  
----------------------------------------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | -00:18:00 
16:00:00.0000000 | 2016-07-22 16:06:00 | 00:06:00 

我想這個查詢:

select shiftend,out,CAST((out-Shiftend) as time(0)) as Output from test 
where 
CAST(CONVERT(NVARCHAR(10), out, 101) AS SMALLDATETIME) = CAST(CONVERT(NVARCHAR(10),'2016-07-22', 101) AS SMALLDATETIME) 

但我得到的輸出作爲

shiftend   | out     |  Output  
----------------------------------------------------------------------------- 
15:00:00.0000000 | 2016-07-22 14:42:00 | 23:42:00 
16:00:00.0000000 | 2016-07-22 16:06:00 | 00:06:00 

23點42分00秒不正確。如何計算時間。

+0

不幸的是,你不能在'time'數據類型負值。它正在將-18變成(00:00 - 00:18),即前一天的23:42。您可以: - 使用'datediff'並將差值保存爲秒數,例如。 - 只保存模塊化差異,並有一個單獨的列來決定它是正面還是負面的差異。 - 編寫自己的SQL函數來計算 – Ash

+0

如果它沒有給我負面的信息,我們只能得到00:18,那就會好的 –

回答

1

嘗試以下查詢:

select 
case when (cast(out as time) < shiftend) then '-' else '' end + 
convert(varchar(8), 
    dateadd(minute, 
    abs(
    DATEDIFF(minute, 
    cast(out as time) 
    , shiftend) 
    ) 
,0) 
,108) as Output 

說明:

  • 你得到兩個日期之間的差異與DATEDIFF(minute, cast(out as time), shiftend)

  • 您只需要time組件即可避免前一天,因此您使用cast(out as time)shiftend你提到已經是數據類型time

  • abs返回絕對值,所以-18變得18.

  • 然後通過使用將上述值作爲分鐘00:00:00產生一日期dateadd(minute, [above value], 0)

  • 最後的是因爲你需要輸出的時間。

  • iif(cast(out as time) < shiftend,'-','')增加了否定符號或不符合單詞的開頭。

不幸的是,在time數據類型中不能有負值。它將-18轉變成00:00 - 18這是23:42。您可以:

  • 使用datediff並將差值另存爲例如秒數。
  • 只保存模塊化差異,並有一個單獨的列來決定它是正面還是負面的差異。
  • 編寫自己的SQL函數計算這是一個varchar如上
+0

你的查詢給出錯誤'不正確的語法接近'<'。 –

+0

你可以運行這個查詢:'從測試中選擇iif(cast(out as time) Ash

+0

不,還是一樣的 –