2011-06-26 14 views
3

は私が時間の2つの列の間の時間を取得するには?

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

は、今私はenterslefts間の時間差を取得したいSQL Serverでテーブルを持っているが、私は、このエラーメッセージが表示されます:

メッセージ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 

[EDIT]

代わり1:05の、1:5を示す避けるため0パディングを追加しました。結果はtimeタイプではなく、varcharのものであろう

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


これを実行する別の方法。

+1

CAST/CONVERT/DECLAREなどを使用してVARCHARを使用し、長さを指定しないように注意してください。場合によっては、これはVARCHAR(1)になり、それ以外の場合にはVARCHAR(30)になります。 VARCHAR(1)になると、無効なデータが処理されます。 varchar(x)だけでなく、実際にはすべての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

宣言でdatetimeキャストを行う理由は何ですか? –

+0

また、OPは列が 'datetime'ではなく' time'型であると言います。 –

+0

@Alex:OMG! OPのチャンスを手に入れてください。 1番目の質問:他のDBMSとの可読性+互換性 –

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

単純な方法は

時刻データ型に

変換()

をDATEに変換した後、位置

に基づい 差を見つけるためにストリングを使用していますsubstr(日付、0,0)から時刻の間

関連する問題