2012-03-15 25 views
19

"WrkHrs"という列があり、データ型は時間(hh:mm:ss)です。従業員の勤務時間を合計したい。しかし、それは時間のデータ型のSQL Server以来、私はsum(columnname)のように使用させません。SQL Serverで時刻フィールドを集計する方法

SQLクエリで時間データタイプをどのように集計できますか?

+2

なぜ、 'INT'または' NUMERIC'ではなく 'TIME'を使用していますか?データは 'TIME'なので、集計している勤務時間が24時間を超える場合、クエリは何を返しますか?結果は' INT'でしょうか? – Lamak

+0

...または2つの別々の列。 –

+0

@Lamakはい私は数値データ型を使うこともできると思います。それは私にとってもっと簡単になるでしょう。 – Sas

答えて

21
SELECT EmployeeID, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
FROM dbo.table 
-- WHERE ... 
GROUP BY EmployeeID; 

フロントエンドでかなりフォーマットすることができます。またはT-SQLで:

;WITH w(e, mw) AS 
(
    SELECT EmployeeID, SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
    FROM dbo.table 
    -- WHERE ... 
    GROUP BY EmployeeID 
) 
SELECT EmployeeID = e, 
    WrkHrs = RTRIM(mw/60) + ':' + RIGHT('0' + RTRIM(mw%60),2) 
    FROM w; 

ただし、間違ったデータ型を使用しています。 TIMEは、時間または間隔ではなく、特定の時点を示すために使用されます。勤務時間を2つの別々の列、つまりStartTimeEndTimeに保存するのは意味がありませんか?あなたは分単位で時間と終了時間を開始し、次のように読みやすい形式に変換シフト間の差を計算することができ、従業員の労働時間を総括するために

+0

私は2つの列を試しましたが、問題はtimediff関数が時間差または分数のどちらかを計算しますが、一緒には計算できませんでした。時間と分を一緒に計算する方法を見つけることができませんでした。だからこそ私はこの方法を選ぶのです。 – Sas

+1

IMHOこれは問題ではありません。常に分から時間/分を得ることができます。 230分= 2時間50分。私は私の答えでこれを正確に示します。 –

2
DECLARE @Tab TABLE 
(
    data CHAR(5) 
) 

INSERT @Tab 
SELECT '25:30' UNION ALL 
SELECT '31:45' UNION ALL 
SELECT '16:00' 

SELECT STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes, 
    '19000101'), 8), 1, 2, CAST((theHours + theMinutes)/3600 AS VARCHAR(12))) 
FROM (
    SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 * 
     LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours, 
    ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 * 
     SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes 
    FROM @Tab 
) AS d 
3

DECLARE @StartTime  datetime = '08:00' 
    DECLARE @EndTime  datetime = '10:47' 
    DECLARE @durMinutes  int 
    DECLARE @duration  nvarchar(5) 

    SET @durMinutes = DATEDIFF(MINUTE, @StartTime, @EndTime) 

    SET @duration = 
    (SELECT RIGHT('00' + CAST((@durMinutes/60) AS VARCHAR(2)),2) + ':' + 
      RIGHT('00' + CAST((@durMinutes % 60) AS VARCHAR(2)), 2)) 

    SELECT @duration 

結果:02:47 2時間47分

関連する問題