데이터 추출 요청으로 VARCHAR 타입의 'hh:mm' 데이터 합계 처리가 필요한 업무가 들어왔다.
문자열 타입이므로 시, 분 데이터를 파싱하고, 분 단위로 변환하여 합계를 구한 후 다시 시, 분으로 변환하여 'hh:mm' 포맷으로 변환해야 한다.
기초 데이터
DROP TABLE IF EXISTS #TIME_DATA;
CREATE TABLE #TIME_DATA (
RUN_TIME VARCHAR(5)
);
-- 예시 데이터 추가
INSERT INTO #TIME_DATA (RUN_TIME) VALUES ('10:30'), ('12:45'), ('08:15'), ('55:29');
시, 분 데이터 파싱
SELECT CAST(SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) AS INT) AS T_MIN
, CAST(RIGHT(RUN_TIME, LEN(RUN_TIME) - CHARINDEX(':', RUN_TIME)) AS INT) AS T_SEC
, SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) * 60 + SUBSTRING(RUN_TIME, 4, 2) AS TOTAL_MIN
FROM #TIME_DATA;
시 : SUBSTRING 함수를 이용하여 구분 문자 ':' 기준 앞까지 부분 문자열을 뽑는다.
분 : RIGHT 함수를 이용하여 오른쪽부터 ':' 기준 오른쪽 문자열 글자의 갯수만큼 부분 문자열을 뽑는다.
분으로 환산 STRING은 * 60 연산에 의해 자동으로 정수로 변환되므로 별도 타입 캐스팅 불필요
합계
SELECT SUM(SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) * 60 + SUBSTRING(RUN_TIME, 4, 2)) AS [총합계]
FROM #TIME_DATA;
SUM 함수를 이용하여 간단히 합계를 분단위로 구할 수 있다.
시, 분으로 변환
SELECT SUM(SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) * 60 + SUBSTRING(RUN_TIME, 4, 2)) AS [총합분단위]
, CAST(SUM(SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) * 60 + SUBSTRING(RUN_TIME, 4, 2)) / 60 AS VARCHAR)
+ ':'
+ CAST(SUM(SUBSTRING(RUN_TIME, 1, CHARINDEX(':', RUN_TIME) - 1) * 60 + SUBSTRING(RUN_TIME, 4, 2)) % 60 AS VARCHAR)
AS [총합계 hh:mm]
FROM #TIME_DATA;
/, % 연산자를 이용하여 적절한 시, 분 단위로 변환하고, 다시 문자열 타입으로 변환 후 합치면 된다.
'데이터베이스 > MS-SQL' 카테고리의 다른 글
부분 문자열 SUBSTRING, LEFT, RIGHT, CHARINDEX 함수 (0) | 2024.02.05 |
---|---|
SPLIT 함수 만들기 (0) | 2024.02.05 |