2012-03-15 2 views
19

"WrkHrs"라는 열이 있고 데이터 형식은 시간 (hh : mm : ss)입니다. 저는 직원들의 근무 시간을 합산하겠습니다. 하지만 시간이 있기 때문에 데이터 형식 SQL Server는 sum(columnname)처럼 사용할 수 없습니다.SQL Server의 시간 필드를 요약하는 방법

SQL 쿼리에서 시간 데이터 형식을 어떻게 요약 할 수 있습니까?

+2

왜 'INT'또는 'NUMERIC'대신에 'TIME'을 사용합니까? 데이터가 '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은 간격 또는 기간이 아닌 특정 시점을 나타내는 데 사용됩니다. 근무 시간을 StartTimeEndTime의 두 개의 별개의 열에 저장하는 것이 합리적이지 않습니까?

+0

두 열을 사용해 보았지만 시간차 함수가 시간 또는 분 사이의 diff를 계산하지만 함께 사용하는 것은 아닙니다. 시간과 분을 함께 계산할 방법을 찾지 못했습니다. 그래서 내가이 방법을 택했다. – 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 분

관련 문제