Как суммировать поля времени в SQL Server - PullRequest
26 голосов
/ 15 марта 2012

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

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

Ответы [ 4 ]

29 голосов
/ 15 марта 2012
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?

4 голосов
/ 05 ноября 2013

Чтобы подвести итог рабочего времени сотрудника, вы можете рассчитать разницу между временем начала смены и временем окончания в минутах и ​​преобразовать ее в читаемый формат следующим образом:

    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 минут

2 голосов
/ 12 сентября 2018

Для MS SQL Server, когда ваш WorkingTime хранится как время, или varchar для его суммирования, вы должны учитывать, что:

1) Формат времени не поддерживает сумму, поэтому вам необходимопроанализируйте это

2) 23: 59: 59.9999999 - максимальное значение для времени.

Итак, код, который будет работать для получения общего количества рабочих часов: 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 голосов
/ 27 сентября 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...