value가 string 으로 구성되어 있는 데이터를 Date 형으로 처리하고 싶은 경우가 있다.
아래의 그림과 같이, 해당 value는 Month'year 형식으로 되어있는데, 우리가 익히 알고 있는 full date(YYYYMMDD) 로 변경해보고자 한다.
string 자체를 substr, concat을 이용해 yyyymmdd string 형식으로 만들고, date type으로 포맷팅하는 방법은 아래와 같다.
SELECT AA.string_date, STR_TO_DATE(AA.full_date, '%Y%m%d') AS full_date
FROM (
SELECT CONCAT(
'20',
substr(string_date,5,6),
case
when substr(string_date,1,3) = 'Jan' then '01'
when substr(string_date,1,3) = 'Feb' then '02'
when substr(string_date,1,3) = 'Mar' then '03'
when substr(string_date,1,3) = 'Apr' then '04'
when substr(string_date,1,3) = 'May' then '05'
when substr(string_date,1,3) = 'Jun' then '06'
when substr(string_date,1,3) = 'Jul' then '07'
when substr(string_date,1,3) = 'Aug' then '08'
when substr(string_date,1,3) = 'Sep' then '09'
when substr(string_date,1,3) = 'Oct' then '10'
when substr(string_date,1,3) = 'Nov' then '11'
when substr(string_date,1,3) = 'Dec' then '12'
END,
'01'
) AS full_date,
string_date
FROM my_data
) AS AA
1. 우선, 각 월에 해당하는 앞 3자리(Jan, Feb, Mar ,...) 를 숫자로된 월로 치환을 해준다. - case when 사용
2. 2000년도이기 때문에, '20', day는 01일로 통일할 것이기 때문에 '01'을 붙여 하나의 string으로 만들어 준다 - concat 사용
3. full_date가 된 문자열을 문자형 타입으로 치환을 해준다. - STR_TO_DATE
해당 방법은 뭔가 코드 길이도 길고, 효율적인 방법은 아닌 것 같다.
아래의 3줄이면 충분하다.
SELECT string_date,
STR_TO_DATE(CONCAT('01 ', string_date), '%d %M\'%y') AS full_date
FROM my_data
1. 우선 concat 함수를 이용해, %d 형식에 맞게 '01' 을 붙여 준다.
2. STR_TO_DATE를 이용해 string이 나열된 순서에 맞게 포맷팅('%d %M\'%y')을 진행한다.
728x90
'Language(R, Python, SQL) > SQL' 카테고리의 다른 글
[SQL] MysQL 데이터베이스 권한 부여 (0) | 2022.12.19 |
---|---|
[SQL] HackerRank - SQL Problem <easy> (0) | 2022.12.08 |
[SQL] Codility SQL exercise 3번 문제 (0) | 2022.11.29 |
[SQL] Codility SQL exercise 2번 문제 (0) | 2022.11.28 |