Подтвердить что ты не робот

Как суммировать поле времени в SQL Server

У меня есть столбец "WrkHrs", а тип данных - время (hh: mm: ss). Я хочу подвести итоги рабочего дня для сотрудников. Но поскольку это время, тип sql-сервера данных не позволяет мне использовать как sum(columnname).

Как я могу суммировать тип данных времени, заданный в sql-запросе?

4b9b3361

Ответ 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