IT/SQL
MSSQL CONVERT 사용법 및 날짜 포맷
아이앤휘
2024. 4. 6. 18:54
CONVERT 사용법
CONVERT 의 경우 날짜포맷을 변경하는 용도로 주로 사용하는데, 구문 및 옵션은 아래와 같고, 그 외의 경우(형변환)에는 몇글자라도 짧은 CAST 를 주로 사용한다.
SELECT CONVERT(NCHAR(8), GETDATE(), 112)

이렇게 마지막 옵션에 112 를 넣으면 char(8) 로 'YYYYMMDD' 형식으로 변환되는데, 마지막 옵션 112 자리에 다른 값들을 넣으면 다른 형식으로 변환이 가능하다, 보통 112,120을 많이 사용한다.
두 자리 연도(yy)1 | 네 자리 연도(yyyy) | Standard | 입출력3 |
---|---|---|---|
- | 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 또는 1131,2 | 유럽 기본값 + 밀리초 | dd mon yyyy hh:mi:ss:mmm (24시간) |
14 | 114 | - | hh:mi:ss:mmm (24시간) |
- | 20 또는 1202 | ODBC 표준 | yyyy-mm-dd hh:mi:ss (24시간) |
- | 21 또는 25 또는 1212 | 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 |
- | 1264 | ISO8601 | yyyy-mm-ddThh:mi:ss.mmm (공백 없음)6 |
- | 1278, 9 | ISO8601(Z 표준 시간대) | yyyy-MM-ddThh:mm:ss.fffZ (공백 없음)6 |
- | 1301,2 | Hijri 5 | dd mon yyyy hh:mi:ss:mmmAM 7 |
- | 1312 | Hijri 5 | dd/mm/yyyy hh:mi:ss:mmmAM |
그런데 날짜 형식 변환을 CONVERT 로 하는 것 보다는 FORMAT 함수 를 이용하는 편이 좀 더 직관적이라서 권장하는 방식이다. 참고 : MSSQL Format 함수
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd'), FORMAT(GETDATE(), 'yyyyMMdd')
결과

이런 날짜변환말고 DataType 변환이 필요한 경우는 CAST 함수를 많이 사용한다.
SELECT CAST( 3.3 AS NUMERIC(8,4))

주의점
CONVERT 이든 CAST 이든 뭔가 값을 변환할 때 원본이 되는 값이 날짜/숫자 형식으로 변환이 가능한 지 먼저 확인해봐야 런타임에서 나는 에러를 방지할 수 있어서 ISNUMERIC, ISDATE 등의 함수로 먼저 체크를 한 후에 변환하는게 좋다.
데이터는 숫자/날짜로 변환이 가능한 데이터가 들어오도록 설계되었지만 입력단에 구멍이 있어서 예상하지 못한 데이터가 들어오는 경우도 있어서...
DECLARE @A VARCHAR(1)
SET @A = 'A'
SELECT CAST( @A AS INT)

DECLARE @A VARCHAR(1)
SET @A = 'A'
SELECT CASE WHEN ISNUMERIC(@A) > 0 THEN CAST( @A AS INT) ELSE NULL END
