iamkanguk.dev

[MySQL] DATE_FORMAT + ORDER BY에서 발생한 이슈 (%c, %e) 본문

SQL/MySQL

[MySQL] DATE_FORMAT + ORDER BY에서 발생한 이슈 (%c, %e)

iamkanguk 2023. 12. 20. 05:07

MySQL에서 Query문을 작성할 때 DATE_FORMAT 메서드를 많이들 사용하실 것이라고 생각한다. 필자는 DATE_FORMAT 메서드를 사용해서 A년 B월 C일로 반환을 해야하는 요구사항이 발생했다. 프로젝트 디자인을 확인해보니 예시를 들어 2023년 8월 7일 이런식으로 앞에 0이 없는 상태로 출력을 해야 하는 상황이었다.

 

DATE_FORMAT % 연산자 사용

- 2023년 08월 07일: DATE_FORMAT(date, "%Y년 %m월 %d일")

- 2023년 8월 7일: DATE_FORMAT(date, "%Y년 %c월 %e일")

 

이런식으로 연산자 사용을 다르게 해서 표현을 할 수 있다. 다른 연산자 사용에 대한 설명을 확인하려면 공식문서 또는 해당 링크를 참고하시면 좋을 것 같습니다!

 

이슈내용

필자는 다음과 같이 쿼리문을 작성했다. 예시이기 때문에 참고만 해주면 좋을 것 같습니다!

select date_format(date, "%Y년 %c월 %e일") as temp
from table_name
order by temp;

 

위와 같이 쿼리문을 작성했는데 다음과 같이 결과값이 나왔다.

 

보면 12월 2일이 12월 17일보다 밑에 있는 것을 확인할 수 있다. 딱 봐도 정렬이 되어있지 않다. 보니까 %c와 %e를 사용하면서 앞에 0이 없어지고, order by를 temp에 걸어주었는데 DATE_FORMAT으로 문자열 타입으로 변경되면서 정렬이 잘못된 것이다.

다시 말해, 문자열로 정렬을 하게 되면 16일/17일이 2일보다 앞에 나오게 되는 것이다.

 

따라서 쿼리문을 필자는 다음과 같이 수정하게 되었다.

select date_format(date, "%Y년 %c월 %e일") as temp
from table_name
order by date_format(date, "%Y년 %m월 %d일");

 

%m월 %d일로 변경해주면서 앞에 0을 세팅해준다. 그렇게 되면 문자열 타입으로 변경이 되어도 올바르게 정렬이 될 것이다!

 

 


참고자료

- https://j07051.tistory.com/606

 

[MySQL]DATE_FORMAT 날짜 표기

DATE_FORMAT( DATETIME date, FORMAT )시간을 원하는 형태로 반환하는 함수 입니다. SELECT DATE_FORMAT(NOW(), "%Y %c/%e %r") -결과 FORAMT 설명 %M 월(Janeary, December, ...) %W 요일(Sunday, Monday, ...) %D 월(1st, 2dn, 3rd, ...) %Y 연

j07051.tistory.com

 

- https://lovelyjk.tistory.com/63

 

[mysql] 날짜 함수 date_format

mysql 의 날짜 함수 date_format(). 아래는 date_format() 함수에서 사용하는 값이다. FORAMT 설명 %M 월(Janeary, December, ...) %W 요일(Sunday, Monday, ...) %D 월(1st, 2dn, 3rd, ...) %Y 연도(1987, 2000, 2013) %y 연도(87, 00, 13) %X

lovelyjk.tistory.com