"WrkHrs"という列があり、データ型は時間(hh:mm:ss)です。従業員の勤務時間を合計したい。しかし、それは時間のデータ型のSQL Server以来、私はsum(columnname)
のように使用させません。SQL Serverで時刻フィールドを集計する方法
SQLクエリで時間データタイプをどのように集計できますか?
"WrkHrs"という列があり、データ型は時間(hh:mm:ss)です。従業員の勤務時間を合計したい。しかし、それは時間のデータ型のSQL Server以来、私はsum(columnname)
のように使用させません。SQL Serverで時刻フィールドを集計する方法
SQLクエリで時間データタイプをどのように集計できますか?
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つの別々の列、つまりStartTime
とEndTime
に保存するのは意味がありませんか?あなたは分単位で時間と終了時間を開始し、次のように読みやすい形式に変換シフト間の差を計算することができ、従業員の労働時間を総括するために
私は2つの列を試しましたが、問題はtimediff関数が時間差または分数のどちらかを計算しますが、一緒には計算できませんでした。時間と分を一緒に計算する方法を見つけることができませんでした。だからこそ私はこの方法を選ぶのです。 – Sas
IMHOこれは問題ではありません。常に分から時間/分を得ることができます。 230分= 2時間50分。私は私の答えでこれを正確に示します。 –
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
:
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分
なぜ、 'INT'または' NUMERIC'ではなく 'TIME'を使用していますか?データは 'TIME'なので、集計している勤務時間が24時間を超える場合、クエリは何を返しますか?結果は' INT'でしょうか? – Lamak
...または2つの別々の列。 –
@Lamakはい私は数値データ型を使うこともできると思います。それは私にとってもっと簡単になるでしょう。 – Sas