일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- type challenge equal type
- node.js
- 이펙티브 타입스크립트
- 와글와글
- 회고
- configmodule
- 스터디
- 2024년 회고록
- 백엔드
- typeorm
- TypeScript
- nestjs
- microsoft azure openai
- HTTP
- 월간cs
- npm
- 타입 챌린지
- 타입챌린지
- 코딩테스트
- 회고록
- type-safe configservice
- TypeScript 타입챌린지
- equal 타입
- 굿바이 2024년
- network
- 타입스크립트
- configservice
- typescript type challenge
- Type Challenge
- 해커톤
- Today
- Total
iamkanguk.dev
[MySQL] DATE_FORMAT + ORDER BY에서 발생한 이슈 (%c, %e) 본문
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
- https://lovelyjk.tistory.com/63