[MSSQL] 날짜 형식 체크 방법 (ISDATE 함수)
- 데이터베이스/MSSQL
- 2022. 12. 13.
SQL Server에서 문자열이 날짜 형식인지 체크할 때는 ISDATE 함수를 사용하면 된다. 날짜인 경우 '1'을 반환하고, 날짜가 아닌 경우 '0'을 반환한다. ISDATE 함수는 CASE 연산자나 WHERE 절에서 ISDATE(칼럼) = 1로 사용하면 된다. 허용되는 날짜 형식이 여러 가지 있기 때문에 아래의 예제를 참고하면 된다.
목차 |
날짜 형식 체크 방법
SELECT ISDATE('2022-12-13')
, ISDATE('2022-12-32')
, ISDATE('2022년12월13일')
ISDATE 함수는 문자열이 날짜 형식인 경우 '1'을 반환하고, 날짜 형식이 아닐 경우 '0'을 반환한다.
위의 예제는 첫 번째 2022-12-13은 정확한 날짜 형식이고, 2022-12-32는 형식은 맞지만 없는 날짜이기 때문에 '0'을 반환한다. 그리고 날짜와 허용되는 구분자 외에 문자(년, 월, 일 등)가 있으면 '0'을 반환한다.
정확한 날짜 형식
SELECT ISDATE('20221213')
, ISDATE('2022-12-13')
, ISDATE('2022/12/13')
, ISDATE('2022.12.13')
, ISDATE('221213')
, ISDATE('2022-1-1')
, ISDATE('12/13/2022')
, ISDATE('2022-12-13 07:05:00')
위의 예제는 ISDATE 함수에서 날짜로 인식하는 날짜 형식이다. 날짜(0)
부정확한 날짜 형식
SELECT ISDATE('2022-02-31')
, ISDATE('2022_12_13')
, ISDATE('2022년12월13일')
, ISDATE('2022-12-1307:05:00')
, ISDATE(NULL)
위의 예제는 ISDATE 함수에서 허용하지 않는 날짜 형식이다. 날짜(X)
ISDATE 함수 활용
WITH temp AS (
SELECT '2022-12-13' AS dte UNION ALL
SELECT '2022-12-32' AS dte UNION ALL
SELECT '2022년12월13일' AS dte
)
SELECT dte
, CASE WHEN ISDATE(dte) = 1 THEN 'O' ELSE 'X' END AS [isdate]
FROM temp
CASE 표현식에서 문자열이 날짜인지 판단할 때 조건으로 사용할 수 있다.
WITH temp AS (
SELECT '2022-12-13' AS dte UNION ALL
SELECT '2022-12-32' AS dte UNION ALL
SELECT '2022년12월13일' AS dte
)
SELECT dte
, CAST(dte AS date) AS [isdate]
FROM temp
WHERE ISDATE(dte) = 1
WHERE 절에서 문자열이 날짜인 경우만 조건을 부여하여 조회할 수 있다.
문자열을 날짜로 변환 시 TRY 함수 사용
CAST 및 CONVERT 함수로 문자열을 날짜로 변환할 때 형식이 맞지 않으면 오류가 발생한다. 이럴 때는 CASE 표현식과 ISDATE 함수를 사용하여 예외 처리를 할 수 있지만, SQL Server 2012부터 TRY 함수가 추가되어서 예외처리를 하지 않아도 오류를 예방할 수 있다.
SELECT TRY_CAST('2022-12-13' AS date)
, TRY_CAST('2022년12월13일' AS date)
, TRY_CONVERT(date, '2022-12-13')
, TRY_CONVERT(date, '2022년12월13일')
TRY 함수를 사용하면 형식이 일치할 경우 형 변환이 되고, 부적합할 경우 NULL을 반환한다.