2012-03-15 3 views
19

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

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

+2

И почему вы используете 'TIME' для этого вместо' INT' или 'NUMERIC' ?. Поскольку данные 'TIME', то, что должен вернуть ваш запрос, когда время работы, которое вы агрегируете, больше 24?, Должен ли результат быть« INT »? – Lamak

+0

... или две отдельные колонки. –

+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 используется для указания момента времени, а не интервала или продолжительности. Не имеет смысла хранить часы работы в двух разных колонках, StartTime и EndTime?

+0

Я пробовал две колонки, но проблема была в функции timediff, которая вычисляет либо разницу между часами или минутами, но не вместе. Я не мог найти способ рассчитать час и минуты вместе. Вот почему я выбираю этот путь. – Sas

+1

ИМХО это не проблема. Вы всегда можете получить часы/минуты с минут. 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 минут

Смежные вопросы