web-dev-qa-db-ja.com

SQL Serverの時間フィールドを合計する方法

「WrkHrs」という列があり、データ型はtime(hh:mm:ss)です。従業員の労働時間をまとめたいです。しかし、今はデータ型のsqlサーバーではsum(columnname)のように使用できません。

SQLクエリでフィールド化された時間データ型を要約するにはどうすればよいですか?

26
Sas
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は、間隔または期間ではなく、特定の時点を示すために使用されます。 StartTimeEndTimeの2つの異なる列に勤務時間を格納するのは理にかなっていないでしょうか?

29
Aaron Bertrand

従業員の労働時間を合計するには、シフトの開始時刻と終了時刻の差を分単位で計算し、次のように読み取り可能な形式に変換できます。

    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

結果:2:47 2時間47分

4
A Ghazal
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
2
Murugan

MS SQL Serverの場合、WorkingTimeを時間またはvarcharとして保存して合計する場合、次のことを考慮する必要があります。

1)時間形式は合計をサポートしていないため、解析する必要があります

2)23:59:59.9999999は時間の最大値です。

したがって、WorkingHours:WorkingMinutes:WorkingSecondsの合計数を取得するために機能するコードは次のようになります。

SELECT 
 CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) / 3600),'00') as varchar(max)) + ':' + 
  CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 / 60),'00') as varchar(max)) + ':' + 
  CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 % 60),'00') as varchar(max)) as WorkingTimeSum
FROM TableName
2
Alex Petrov