我有一個表中的SQL Server如何獲得兩列時間之間的時間?
id int,
enters time,
left time,
date datetime,
user varchar(50)
現在我想enters
和lefts
之間的時間差,但我收到此錯誤信息:
消息8117,級別16,狀態1,第1行
操作數數據類型時間對於減法運算符無效。
我該怎樣才能讓時間過去?
例如,如果用戶在8.00進入並在9.15離開,我需要得到1.15。
我該怎麼做?
我有一個表中的SQL Server如何獲得兩列時間之間的時間?
id int,
enters time,
left time,
date datetime,
user varchar(50)
現在我想enters
和lefts
之間的時間差,但我收到此錯誤信息:
消息8117,級別16,狀態1,第1行
操作數數據類型時間對於減法運算符無效。
我該怎樣才能讓時間過去?
例如,如果用戶在8.00進入並在9.15離開,我需要得到1.15。
我該怎麼做?
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:05
1:5
。
另一種方式來做到這一點:
select cast(dateadd(minute, datediff(minute, enters, lefttime), 0) as time)
from @MyTable
結果將是time
類型,而不是varchar
的。
請注意使用CAST/CONVERT/DECLARE等VARCHAR並且不要使用長度。在某些情況下,這將變成VARCHAR(1),在其他情況下變成VARCHAR(30)。當它變成VARCHAR(1)時,你將處理無效數據。總是聲明varchar(x),而不僅僅是varchar(實際上,所有的char類型)。 –
@Aaron Bertrand - 你在說'在某些情況下,這會變成VARCHAR(1)'。你能在這種特殊情況下展示它如何變成VARCHAR(1)? –
不是在這種特殊情況下,但我在談論一般的做法。最好養成一種總是宣告長度的習慣,尤其是如果你給別人學習的樣本代碼。 –
看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))
你爲什麼要在宣言中投入日期時間? –
另外OP說,列的類型是「時間」,而不是「日期時間」。 –
@亞馬遜:OMG!給OP機會閱讀手冊。關於第一個問題:更好的可讀性+與其他DBMS的兼容性 –
select
id
,enters
,[left]
,date
,[user]
,CONVERT(time,DATEADD(second, DATEDIFF(second,enters,[left]), 0)) as [Difference]
from
MyTable
簡單的方法是
日期轉換爲時間數據類型
轉換()
然後用串基於位置找到 差異
在substr(日期,0,0)和時間
之間
請稍等一些代碼? – leon