2011-06-26 35 views
3

我有一個表中的SQL Server如何獲得兩列時間之間的時間?

id int, 
enters time, 
left time, 
date datetime, 
user varchar(50) 

現在我想enterslefts之間的時間差,但我收到此錯誤信息:

消息8117,級別16,狀態1,第1行
操作數數據類型時間對於減法運算符無效。

我該怎樣才能讓時間過去?
例如,如果用戶在8.00進入並在9.15離開,我需要得到1.15。
我該怎麼做?

+0

請稍等一些代碼? – leon

回答

4
declare @MyTable table(enters time, lefttime time) 
insert @MyTable values('8:00', '9:05') 

select *, 
    cast(datediff(hour, enters, lefttime) as varchar) + ':' + 
     right('0' + cast(datediff(minute, enters, lefttime) % 60 as varchar), 2) 
from @MyTable 

[編輯]

添加0填充,以避免顯示的代替1:051:5


另一種方式來做到這一點:

select cast(dateadd(minute, datediff(minute, enters, lefttime), 0) as time) 
from @MyTable 

結果將是time類型,而不是varchar的。

+1

請注意使用CAST/CONVERT/DECLARE等VARCHAR並且不要使用長度。在某些情況下,這將變成VARCHAR(1),在其他情況下變成VARCHAR(30)。當它變成VARCHAR(1)時,你將處理無效數據。總是聲明varchar(x),而不僅僅是varchar(實際上,所有的char類型)。 –

+0

@Aaron Bertrand - 你在說'在某些情況下,這會變成VARCHAR(1)'。你能在這種特殊情況下展示它如何變成VARCHAR(1)? –

+0

不是在這種特殊情況下,但我在談論一般的做法。最好養成一種總是宣告長度的習慣,尤其是如果你給別人學習的樣本代碼。 –

3

DATEDIFF函數。

DECLARE @enters datetime = CAST('2011-06-26T08:00:00' as datetime); 
DECLARE @left datetime = CAST('2011-06-26T09:15:00' as datetime); 

SELECT CAST(DATEDIFF(HH, @enters, @left) as varchar(max)) 
    + ':' + CAST(DATEDIFF(MI, @enters, @left) % 60 as varchar(max)) 
+0

你爲什麼要在宣言中投入日期時間? –

+0

另外OP說,列的類型是「時間」,而不是「日期時間」。 –

+0

@亞馬遜:OMG!給OP機會閱讀手冊。關於第一個問題:更好的可讀性+與其他DBMS的兼容性 –

1
select 
    id 
    ,enters 
    ,[left] 
    ,date 
    ,[user] 
    ,CONVERT(time,DATEADD(second, DATEDIFF(second,enters,[left]), 0)) as [Difference] 
from 
    MyTable 
0

簡單的方法是

日期轉換爲時間數據類型

轉換()

然後用串基於位置找到 差異

在substr(日期,0,0)和時間

之間
相關問題