첫 sql문 문제 풀이이다.
데이터베이스설계를 들으면서 sql문은 어느 정도 익숙해져 있고, 정처기를 준비하면서도 복잡한 sql문을 공부해 왔어서 어렵지 않게 문제를 풀 수 있었으나...! 역시 디테일한 부분은 좀 더 공부할 필요가 있음을 느낀 첫 문제였다.
DATE 형식의 컬럼의 출력 형태 변환하는 방법!
이 문제에서 내가 걸렸던 부분은 주의사항에 있는 DATE 형식을 주어진 예제의 출력결과처럼 변경하여 출력할 수 있도록 하는 것이었다.
문제에서 PUBLISHED_DATE의 형식을 'YYYY-MM-DD' 형태로 출력하도록 요구하고 있다.
처음에는 이 부분을 확인하지 못하고 그냥 출력해 보았는데, 뒤에 상세한 시간까지 출력되는 것을 확인하였다.
이렇게 시간까지 표시되는 것을, 날짜만 표시되도록 변경해주어야 한다.
이때 사용할 수 있는 것이 DATE_FORMAT() 함수이다!!
mysql : DATE를 원하는 형식으로 변경하기
각 sql마다 다른데, 내가 사용하는 mysql을 기준으로는 다음과 같은 방식을 사용할 수 있다.
1. 날짜→문자열로 변환
DATE FORMAT(날짜, 출력 형식)
문제 예시 ) DATE_FORMAT(A.PUBLISHED_DATE, '%Y-%m-%d')
위의 형태의 날짜를 '2020-01-02'의 형태로 리턴해준다.
2. 문자열→날짜로 변환
STR_TO_DATE(문자, 출력 형식)
예시)
STR_TO_DATE('20080101', '%Y-%m-%d')
20080101이라는 문자를 2008-01-01의 형태의 날짜로 리턴해준다.
여기에서 주의할 점은 '%Y-%m-%d' 이 부분인데, 여기에서 Y이면 '2020'과 같은 형태를, m이면 '03'과 같은 형태를, d이면 '23'과 같은 형태로, 보통 'yyyy-mm-dd'형식의 출력을 얻을 수 있다.
이 부분이 왜 헷갈리냐면, 저 문자를 대문자로 쓰느냐, 소문자로 쓰느냐에 따라 다른 출력이 되기 때문이다.
나도 처음에는 모두 대문자로 써서, 월은 'march', 일은 'secondary_three' 이런식으로 나왔다.
따라서 형식에 따라 잘 구분지어 주어야 한다.
자세한 내용은 아래의 표를 참고하자.
**FORMAT설명
%M | Month 월(Janeary, February ...) |
%m | Month 월(01, 02, 03 ...) |
%W | Day of Week 요일(Sunday, Monday ...) |
%D | Month 월(1st, 2dn, 3rd ...) |
%Y | Year 연도(1999, 2000, 2020) |
%y | Year 연도(99, 00, 20) |
%X | Year 연도(1999, 2000, 2020) %V와 같이쓰임 |
%x | Year 연도(1999, 2000, 2020) %v와 같이쓰임 |
%a | Day of Week요일(Sun, Mon, Tue ...) |
%d | Day 일(00, 01, 02 ...) |
%e | Day 일(0, 1, 2 ..) |
%c | Month(1, 2, 3 ..) |
%b | Month(Jen Feb ...) |
%j | n번째 일(100, 365) |
%H | Hour 시(00, 01, 24) 24시간 형태 |
%h | Hour 시(01, 02, 12) 12시간 형태 |
%I(대문자 아이) | Hour 시(01, 02 12) 12시간 형태 |
%l(소문자 엘) | Hour 시(1, 2, 12) 12 시간 형태 |
%i | Minute 분(00, 01 59) |
%r | hh:mm:ss AP |
%T | hh:mm:ss |
%S, %s | Second 초 |
%p | AP, PM |
%w | Day Of Week (0, 1, 2) 0부터 일요일 |
%U | Week 주(시작: 일요일) |
%u | Week 주(시작 월요일) |
%V | Week 주(시작: 일요일) |
%v | Week 주(시작:월요일) |
위의 방법을 사용하고 출력한 결과이다.
원하는 출력 형태를 얻을 수 있었다!
전체 코드는 아래와 같다.
SELECT A.BOOK_ID, B.AUTHOR_NAME, DATE_FORMAT(A.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK A JOIN AUTHOR B ON A.AUTHOR_ID=B.AUTHOR_ID
WHERE A.CATEGORY='경제'
ORDER BY A.PUBLISHED_DATE;
join할 때 조인할 테이블을 A, B이런식으로 지정해주는 건 정처기 때 버릇.. 아주 좋은 버릇인거 같다.
가끔 안해도 돌아갈 때가 있는데, 정확하게 쓰는 거는 위가 맞기 때문에, 최대한 쓰려고 한다.
select ~ from~join~on~where~order by~ 순으로 알아보기 쉽게 줄바꿈 해 두었다.
* DATE_FORMAT(A.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
이런 부분의 경우, 예시 출력 형태를 보고 컬럼 이름을 잘 지정해주는 것이 중요한 포인트이다.
아깝게 틀릴 수 있는 사소한 문제이기 때문이다!
이상 백준허브 연동 겸 가볍게 풀어본 sql문제였다.
'CO-TE > 프로그래머스' 카테고리의 다른 글
[프로그래머스] MYSQL LV4 주문량이 많은 아이스크림들 조회하기 / UNION ALL 이용 (1) | 2023.10.18 |
---|---|
[프로그래머스] c++ LV2 타겟 넘버 / DFS 알고리즘 사용 (0) | 2023.10.17 |
[프로그래머스] c++ LV2 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT) 풀이/접근 방식 (0) | 2023.10.12 |
[프로그래머스] c++ LV2 요격 시스템 풀이/접근방법 (0) | 2023.10.12 |
[프로그래머스] c++ LV1 대충 만든 자판 (0) | 2023.09.13 |