홍카나의 공부방

[SQL] MySQL : 연월일 중 월을 표현하고 싶을 때 (DATE_FORMAT) 본문

Data Engineering/Database

[SQL] MySQL : 연월일 중 월을 표현하고 싶을 때 (DATE_FORMAT)

홍문관카페나무 2023. 5. 28. 22:57
CREATE TABLE IF NOT EXISTS order_summary_daily (
    order_date date,
    order_country varchar(16),
    total_revenue numeric,
    order_count int
);

위와 같은 쿼리로 테이블을 하나 만들었다고 가정하자.

그리고 특정 월에 특정 국가에서 발생한 주문으로 발생한 수익을 확인하고 싶다고 할 때,

-- 특정 월에 특정 국가에서 발생한 주문으로 발생한 수익은 얼마인가?

SELECT
    date_format(order_date, '%m') as order_month,
	-- MID(order_date, 6, 2) as order_month,
    order_country,
    SUM(total_revenue) as order_revenue
FROM order_summary_daily
GROUP BY
    order_month,
    order_country
ORDER BY order_month, order_country;

SELECT에서 크게 두 가지 방법을 사용할 수 있다.

 

1) DATE_FORMAT을 이용한다. DATE_FORMAT( 대상 컬럼, 원하는 포맷 )을 사용하면 된다. 만약 연-월로 표현하고 싶으면 DATE_FORMAT(order_date, '%Y-%m')을 사용하면 된다.

 

2) MID를 이용해서 해당 컬럼의 레코드에 담긴 date 값을 파싱 한다. date는 '2023-05-28' 이런 형식으로 담겨있는데,

MID(대상 컬럼, 시작 위치, 글자수) 양식에 맞게 사용하면, 글자수만큼 문자열을 반환해 준다.

LEFT로 연-월 형식을 파싱 할 수도 있는데 그건 사용자 목적에 따라 알아서 하면 된다.

 

코드의 가독성을 위해서는 DATE_FORMAT이 약간 더 권장되는 방식이라고 생각한다.

나 혼자 봐서는 스키마에 대한 이해가 되서 바로바로 의미를 파악할 수 있지만, 다른 사람이 DATE_FORMAT과 MID를 마주쳤을 때 빠르게 그 의미를 해석할 수 있는 것은 전자라고 생각한다.

 

그리고 월의 표시 형식을 '06', '07' 이런게 아니라 'June', 'July'로 표현할 수 있는 확장성이 큰 방법도 DATE_FORMAT 내장함수를 이용하는 방법이기도 하다.

 

레코드 몇개 INSERT 해서 SELECT 찍어본 결과.

반응형