개요
데이터베이스에서 날짜를 다룰 때 날짜별로 결과를 확인하거나 데이터를 처리해야되는 경우가 있다.
하지만 데이터베이스 혹은 프레임워크에 따라 서로 다른 날짜 표시 형식으로 출력될 수 있다.
이로 인해 매번 다르게 처리해야하는 곤란할 경우가 생길 수 있다.
(시계열 데이터가 다르게 출력되는 이유는 데이터베이스의 버전, 데이터베이스 시스템에 설정된 언어, 데이터베이스 및 테이블에 정의된 인코딩 형식에 따라 다를 수 있다.)
- 예시
종류 | 내용 | 날짜 출력 형식 |
A데이터베이스 | 날짜 및 시간 데이터 형식의 데이터 출력 | 2024-01-24 12:00:00 |
B데이터베이스 | 날짜 및 시간 데이터 형식의 데이터 출력 | 2024-01-24 12:00:00.000 |
C데이터베이스 | 문자열 관련 함수(LEFT) 사용하여 출력 | Jan 24 2024 12:57PM |
위의 예시처럼 시계열 원본의 값이 같은 데이터가 서로 다른 표시 형식으로 표현된다면 어떻게 해야할까?
정답은 데이터베이스에 저장된 날짜 및 데이터 형식의 시계열 데이터를 일관된 특정 형식으로 변경하여 출력하면 된다.
FORMAT 함수를 이용하여 날짜의 형식을 변경할 수도 있다.
단, FORMAT 함수를 사용할 경우 위와 같은 서로 다른 시스템에서 또 다시 문제가 되풀이 될 수 있다.
이러한 경우를 방지하기 위해서 날짜 및 시간의 표시 형식을 변경할 때에는 사전에 정의된 표준 표시 형식을 공통으로 사용하여 혼선을 줄일 수 있다.
가장 표준적인 시계열 표시 형식은 'ODBC 표준'을 따르는 표시 형식이다. (예: 2024-01-24 12:00:00)
이 포스팅은 날짜의 표시 형식을 변경하는 내용을 다룬다.
SSMS DB에서 시간을 확인하거나 특정 시간 확인이 필요한 경우는 아래의 포스팅을 참고하자.
날짜 표시 방법 바꾸기 (날짜 포맷 형식 변경)
CAST 및 CONVERT 함수
설명
날짜 및 시간 데이터 타입을 변환하려면 CAST 및 CONVERT 함수를 사용하여야 한다.
위의 함수를 통해 날짜 타입의 표시 형식을 원하는 형식으로 바꿀 수 있다.
일반적으로는 ODBC 표준 표시 형식을 따른다.
예시) 현재 시각 : 2024-01-24 12:36:08.173
- 2024-01-24 12:36:08.173 (밀리초가 포함된 ODBC 표시형식)
- 2024-01-24 12:36:08 (ODBC 표시형식)
- 2024.01.24 (ANSI 표시형식)
- 20240124 (ISO 표시형식)
- 등등
기본 구문
-- CAST 구문
CAST ( expression AS data_type [ ( length ) ] )
-- CONVERT 구문
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
날짜 변환표
주로 많이 쓰는 날짜 표시 형식 크게 두 가지이다.
- 120(ODBC 표준)
- 121(밀리초가 포함된 ODBC 표준)
두 자리 연도(yy) | 네 자리 연도 (yyyy) |
Standard | 입출력 |
- | 0 또는 1001,2 | datetime 및 smalldatetime의 기본값 | mon dd yyyy hh:miAM(또는 PM) |
1 | 101 | 미국 | 1 = mm/dd/yy 101 = mm/dd/yyyy |
2 | 102 | ANSI | 2 = yy.mm.dd 102 = yyyy.mm.dd |
3 | 103 | 영국/프랑스 | 3 = dd/mm/yy 103 = dd/mm/yyyy |
4 | 104 | 독일어 | 4 = dd.mm.yy 104 = dd.mm.yyyy |
5 | 105 | 이탈리아어 | 5 = dd-mm-yy 105 = dd-mm-yyyy |
6 | 1061 | - | 6 = dd mon yy 106 = dd mon yyyy |
7 | 1071 | - | 7 = Mon dd, yy 107 = Mon dd, yyyy |
8 또는 24 | 108 | - | hh:mi:ss |
- | 9 또는 1091,2 | 기본값 + 밀리초 | mon dd yyyy hh:mi:ss:mmmAM(또는 PM) |
10 | 110 | USA | 10 = mm-dd-yy 110 = mm-dd-yyyy |
11 | 111 | 일본 | 11 = yy/mm/dd 111 = yyyy/mm/dd |
12 | 112 | ISO | 12 = yymmdd 112 = yyyymmdd |
- | 13 또는 113 | 유럽 기본값 + 밀리초 | dd mon yyyy hh:mi:ss:mmm(24시간) |
14 | 114 | - | hh:mi:ss:mmm(24시간) |
- | 20 또는 120 | ODBC 표준 | yyyy-mm-dd hh:mi:ss(24시간) |
- | 21 또는 25 또는 121 | time, date, datetime2, datetimeoffset의 ODBC 표준(밀리초 포함) 기본값 | yyyy-mm-dd hh:mi:ss.mmm(24시간) |
22 | - | 미국 | mm/dd/yy hh:mi:ss AM(또는 PM) |
- | 23 | ISO8601 | yyyy-mm-dd |
- | 126 | ISO8601 | yyyy-mm-ddThh:mi:ss.mmm(공백 없음) |
- | 127 | ISO8601(Z 표준 시간대) | yyyy-MM-ddThh:mm:ss.fffZ(공백 없음) |
- | 130 | Hijri | dd mon yyyy hh:mi:ss:mmmAM |
- | 131 | Hijri | dd/mm/yyyy hh:mi:ss:mmmAM |
날짜 표시 형식 변경 예시
select convert(nvarchar(max), getdate(), 102)
-- 2024.01.24
select convert(nvarchar(max), getdate(), 103)
-- 24/01/2024
select convert(nvarchar(max), getdate(), 12)
-- 240124
select convert(nvarchar(max), getdate(), 120)
-- 2024-01-24 12:36:08
select convert(nvarchar(max), getdate(), 121)
-- 2024-01-24 12:36:08.173
FORMAT 함수
설명
날짜 및 시간 데이터 타입을 FORMAT 함수를 통해서도 원하는 형식으로 변경할 수 있다.
FORMAT 함수는 표시되는 날짜 형식을 사용자가 임의대로 표시 형식을 변경할 수 있다는 장점이 있다.
단, 서로 다른 시스템에서 표시 형식의 차이로 인한 오류 발생 가능성을 염두하여야 한다.
기본 구문
FORMAT( value, format [, culture ] )
날짜 형식 (날짜 포맷)
예시 : 2024년 1월 24일 오후 1시 2분 3초
문자 | 설명 | 입출력 |
yy 또는 yyyy | 연도 두 자리 / 네 자리 표시 | 24 또는 2024 |
M 또는 MM | 월 한두 자리 표시 | 1 또는 01 |
d 또는 dd | 일 한두 자리 표시 | 24 또는 24 (1일의 경우 1 또는 01) |
ddd | 요일을 세 글자로 표시 | Wed (수) |
dddd | 요일 표시 | Wednesday (수요일) |
h 또는 hh | 시간 한두 자리 표시 | 1 또는 01 |
m 또는 mm | 분 한두 자리 표시 | 2 또는 02 |
s 또는 ss | 초 한두 자리 표시 | 3 또는 03 |
f 또는 ff 또는 fff | 밀리초 1~3 자리 표시 | .0 또는 .00 또는 .000 |
t 또는 tt | 오전 오후 표시 | P 또는 PM (오 또는 오후) |
날짜 표시 형식 변경 예시
- SSMS(MS-SQL)의 설정 언어에 따라 나오는 요일 및 오전/오후 정보가 다르게 출력될 수 있다.
select format(getdate(), 'yy년 M월 d일 dddd tt hh시 mm분 ss.fff초')
-- 24년 1월 24일 수요일 오후 01시 52분 44.973초