Как суммировать поле времени в SQL Server
У меня есть столбец "WrkHrs", а тип данных - время (hh: mm: ss). Я хочу подвести итоги рабочего дня для сотрудников. Но поскольку это время, тип sql-сервера данных не позволяет мне использовать как sum(columnname)
.
Как я могу суммировать тип данных времени, заданный в sql-запросе?
Ответы
Ответ 1
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
используется для указания момента времени, а не интервала или продолжительности. Не имеет смысла хранить часы работы в двух разных столбцах, StartTime
и EndTime
?
Ответ 2
Чтобы суммировать рабочее время для сотрудника, вы можете рассчитать разницу между временем начала старта и временем окончания в минутах и преобразовать его в читаемый формат следующим образом:
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
два часа и 47 минут
Ответ 3
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