일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- typeorm
- TypeScript 타입챌린지
- 이펙티브 타입스크립트
- TypeScript
- 타입스크립트
- nestjs
- 타입챌린지
- 189-Awaited
- Type Challenge
- 해커톤
- 노드 교과서 개정2판
- 월간cs
- node.js
- 스터디 회고
- 타입 챌린지 Deep Readonly
- Conditional Types
- Mappilogue
- 와글와글
- type challenge omit
- npm
- 타입 챌린지
- HTTP
- 백엔드
- 타입챌린지 Readonly2
- Array.prototype.push
- 와글와글 해커톤
- 맵필로그
- network
- 코딩테스트
- 타입 챌린지 IndexOf
- 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
[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