2017-09-08 6 views
0

現在、日付間の時間差を求めて時間(00:00)に出力することを検討しています。しかし、私はこの計算を合計するつもりです。つまり、char/varcharに変換できません。datetimeフィールドを使用してSQLの日付差をchar/varcharに変換せずに計算する

下記のデータ例をご覧ください。期間のため

EMPLOYEE_ID Start    End     Duration 
1   05/06/2015 08:30 05/06/2015 12:12 03:42 
1   05/06/2015 13:18 05/06/2015 17:00 03:42 
1   06/06/2015 08:30 06/06/2015 12:12 03:42 
1   06/06/2015 13:18 06/06/2015 17:00 03:42 

現在のコードは:それはvarchar型だと私は2つの期間を合計するに行きたいと

CONVERT(varchar(5),DATEADD(minute,DATEDIFF(minute,Start, End),0), 114) as Duration 

明らかに、このコードは、私はそれを望んでいませんか。私は周りを見回しましたが、これがどのように行われるかを示すものは見つかりませんでした。

答えて

2

は、分単位で時間を計算します。

select datediff(minute, start, end) as duration_min 
. . . 

これはで動作する方がはるかに簡単です。次に、分を合計します。

select sum(datediff(minute, start, end)) as duration_min 

このようにしておくことをお勧めします。しかし、HH:MM形式でそれをしたい場合は、必要な形式の文字列に手動で変換してください。

timeデータ型は使用しないでください。 24時間に制限されています。

1

SQL Server doesn't currently supoort the ANSI SQL INTERVAL data typeこのように集計をサポートするためにできる最善のことは、一定の測定単位(ここで使用した分など)で期間を計算し、集計結果を使用して固定の日時値から間隔を計算します。以下の例では、結果を文字列に変換するためにFORMAT関数を使用していますが、表示用の書式設定はT-SQLではなくプレゼンテーションレイヤで行うことをお勧めします。

CREATE TABLE dbo.EmployTimeRecord (
     EMPLOYEE_ID int NOT NULL 
    , StartTime smalldatetime NOT NULL 
    , EndTime smalldatetime NOT NULL 
    , DurationMinutes AS DATEDIFF(minute, StartTime, EndTime) 
    ); 

INSERT INTO dbo.EmployTimeRecord(EMPLOYEE_ID, StartTime, EndTime) 
    VALUES 
     (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00') 
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00') 
    , (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00') 
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00'); 


SELECT 
     EMPLOYEE_ID 
    , FORMAT(DATEADD(minute, SUM(DurationMinutes), ''), 'HH:mm') AS Duration 
FROM dbo.EmployTimeRecord 
GROUP BY EMPLOYEE_ID; 
関連する問題