Database/SQL

[프로그래머스 SQL Lv.1] 조건에 맞는 도서 리스트 출력하기 (MySQL), DATE_FORMAT 함수 이용해서 날짜 조회 형식 맞추기

imnyoung 2025. 11. 25. 23:08

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

1. 테이블 : BOOK

Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 ()
PUBLISHED_DATE DATE FALSE 출판일

 

2. 문제

BOOK 테이블에서 (1) 2021년에 출판 (2) '인문' 카테고리에 속하는 도서 리스트를 찾아서 (3) 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요. 결과는 (4) 출판일을 기준으로 오름차순 정렬해주세요.

*주의: PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

BOOK_ID PUBLISHED_DATE
4 2021-03-15
3 2021-04-11

 

3. 문제풀이

1) published_date 타입 탐색

가장 먼저 든 의문은 published_date와 관련된 의문이었다. 아래와 같은 쿼리 결과를 보니 published_date에 시간까지 같이 나온 것이었다. 분명 문제에서 published_date의 타입이 datetime이 아니라 date라고 명시해뒀기 때문에, 여기서 한번 궁금증이 생겼다.

SELECT book_id, published_date
FROM book
WHERE year(published_date) = 2021 
AND category = "인문"
ORDER BY published_date

실행 결과가 이렇게 나왔었다...

그래서 문제가 틀린건가? 라는 생각에 실제로 DB에 저장되어 있는 데이터 타입을 확인해 보았다.

DESC book;   -- 테이블 구조 확인
DESC 또는 DESCRIBE 모두 가능. 테이블의 칼럼 명과, NULL 조건 여부, 데이터 타입을 알아 볼 수 있는 명령어이다.

그 결과 published_date는 date로 잘 저장되어 있었다.

찾아보니 특정 데이터베이스 툴이 날짜/시간 유형의 데이터를 처리할 때 일관성을 위해 전체 타임스탬프 형식을 고수하도록 설계되어 있다면 시간 정보를 00:00:00 으로 표시한다고 한다.

2) published_date 조회 시 형식 맞추기

그렇다면 published_date 조회 시 시간 정보 없이 날짜만 출력되도록 하기 위해서는 어떻게 해야 할까?

바로 DATE_FORMAT(날짜, '포맷') 함수를 이용하면 된다! 아래 표는 포맷 종류이고, 볼드체는 자주 쓰이는 종류이다.

포멧문자 설명
%Y 년도 (2023)
%y 년도(23)
%d (01,19)
%e (1,19)
%T 시간(12:30:00)
%r 시간(12:30:00 AM)
%H 24시간 시간(01, 14, 18)
%h, %l 12시간 시간(01,02,06)
%m (01,02,11)
%c (1,8)
%M (January, August)
%b (Jan,Aug)
%W 요일(Wednesday, Sunday)
%i (00)
%S, %s (00)
원래 MySQL에서는 DATE(published_date)로도 날짜만 출력되도록 설정할 수 있는데, 프로그래머스에서는 틀린 답으로 나온다고 한다... (해당 문제 질문하기 글 참고)

 

4. 정답

따라서 정답은 

SELECT book_id, DATE_FORMAT(book.published_date, '%Y-%m-%d') as "published_date" -- 별칭 지정해주기
FROM book
WHERE year(published_date) = 2021  -- 2021년에 출판된('2021'도 가능)
AND category = "인문"   -- '인문' 카테고리에 속하는
ORDER BY published_date  -- 출판일을 기준으로 오름차순 정렬
'2021'도 가능한 이유: MySQL은 비교할 때 문자열 '2021'을 숫자 2021로 자동 형 변환해서 비교하기 때문. 하지만 숫자 비교가 더 좋다!

 


Reference

https://velog.io/@gloz0315/SQL-%EB%82%A0%EC%A7%9C-%ED%98%95%EC%8B%9D-%EB%B3%80%EA%B2%BD

https://dalcheonroadhead.tistory.com/657

https://easyitwanner.tistory.com/276 (날짜와 시간 데이터 유형과 예시 정리)

https://guiyomi.tistory.com/11#:~:text=Oracle/PostgreSQL%20%EC%A3%BC%EB%A1%9C%20TO_CHAR()%20%ED%95%A8%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B2%8C%20%EB%90%9C%EB%8B%A4.%20PostgreSQL%EA%B3%BC,%EC%95%84%EB%9E%98%20%ED%91%9C%EC%97%90%20%EC%9E%90%EC%A3%BC%20%EC%93%B0%EC%9D%B4%EB%8A%94%20%ED%8F%AC%EB%A7%B7%20%EC%A2%85%EB%A5%98%EB%A5%BC%20%EC%A0%95%EB%A6%AC%ED%96%88%EB%8B%A4.

https://www.blog.data101.io/50 (날짜/시간 표기방식 지정하기)