서버에 있는 DB를 테스트용으로 로컬에 설치했다. 그러면서 버전을 8.0.29로 설치했다. (서버는 5.x)
그랬더니.. 멀쩡히 잘 돌던 쿼리가 오류를 막 뱉어낸다.
알고보니.. 쿼리중에 GROUPS라는 이름을 붙여서 쓰고있었는데..
이것이 예약어가 되어버린것.
그래서 해당 예약어를 찾아서 모두 ` (1옆에 있는 키)를 앞 뒤로 감싸주어 해결.
추가된 예약어들 목록은..
https://dev.mysql.com/doc/refman/8.0/en/keywords.html
위 링크에 들어가면 찾을 수 있다.
그리고 추가로.. 해당 월의 데이터를 찾기 위한 쿼리를 실행할 때 발견한 부분.
DateTime의 경우 비교 시, 'YYYY-MM-DD'형태만 비교 가능하다. 5.x에서는 'YYYYMMDD'형태로 검색이 가능했으나 8.x부터는 허용이 안된다고.. 그래서 비교시 다음과 같이 수정해야한다.
SELECT .. FROM MyTable mt
WHERE mt.Date BETWEEN '20220901' AND '20220931' << 실패
WHERE mt.Date BETWEEN '2022-09-01' AND '2022-09-30' << 성공
WHERE DATE_FORMAT(mt.Date, '%Y%m%d') BETWEEN '20220901' AND '20220931' << 성공
WHERE mt.Date BETWEEN '2022-09-01' AND '2022-09-31' << 실패
YYYYMMDD형태로 비교하고싶으면 DateTime 데이터를 DATE_FORMAT을 이용하여 YYYYMMDD형태로 만든 후 비교 가능하다. 아니면 YYYY-MM-DD형태로 비교할것. 대신, 마지막 실패 case처럼 존재하지 않는 날짜로 비교하려고하면 오류발생함.
-> YYYY-MM-DD형태로 비교하려면 월별로 날짜가 맞는지 확인하는 로직 필요하다.
그러니.. 월별로 마지막날짜를 맞추어서 해당 월에 들어가는 마지막 날을 전달해줘야한다.
귀찮으면 DATE_FORMAT을 활용하자.
반응형
댓글