복붙노트

[SQL] 어떻게 SQL Server의 시간 필드를 요약하기

SQL

어떻게 SQL Server의 시간 필드를 요약하기

나는 열은 "WrkHrs"라고하고 데이터 유형은 시간 (hh : mm : ss)입니다. 나는 직원의 근무 시간을 요약하고 싶다. 그러나 그것의 시간 데이터 형식 SQL 서버 나 합 (기둥 이름)처럼 사용하지 않기 때문에.

어떻게 SQL 쿼리의 시간 데이터 형식 필드를 요약 할 수 있습니까?

해결법

  1. ==============================

    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;
    

    그러나 잘못된 데이터 유형을 사용하고 있습니다. 시간은 특정 시점이 아닌 간격 또는 기간을 표시하는 데 사용됩니다. 이 의미는 두 가지 열, 상영 시간 및 종료 시각에 자신의 근무 시간을 저장하지 않을까요?

  2. ==============================

    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
    

    결과 : 2시 47분 2 시간 47분

  3. ==============================

    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
    
  4. ==============================

    4.MS SQL 서버를 들어, WorkingTime이 시간, 당신이 고려해야 정리해하기 위해 VARCHAR로 저장하는 경우 :

    MS SQL 서버를 들어, WorkingTime이 시간, 당신이 고려해야 정리해하기 위해 VARCHAR로 저장하는 경우 :

    당신이 그것을 구문 분석 할 필요가 있으므로 1) 시간 형식은 합계를 지원하지 않습니다

    2) 23 : 59 : 59.9999999 시간의 최대 값이다.

    WorkingMinutes : 그래서, 작동 코드는 당신에게 WorkingHours의 총 수를 얻을 수 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
    
  5. from https://stackoverflow.com/questions/9725732/how-to-sum-up-time-field-in-sql-server by cc-by-sa and MIT license