220406 mysql date 타입 쿼리를 만들자

1 분 소요

로그 결과를 기간 별로 찍는 일이 생겨 관련 자료를 검색해 보았다.
아무래도, 날짜를 date_format, 그리고 관련한 날짜 연산 함수를 사용하여 필터링한 후, 그것을 group by 함수로 엮어 한번에 조회가 가능한 것으로 보였다.

적절한 예제를 통해 실험하려는데,,

값이 왜 저러지

분명 테이블에 2019년 데이터는 없었다.

없단 말이야

이 쿼리는… 검색으로 얻은 주간 통계 쿼리에, start와 end날짜를 월에 맞게끔 나타내고 싶어서 끄적인 쿼리였다. 위쪽이 주간 쿼리고, 아래가 문제의 월간 쿼리다.

중간에 나타나는 모든 값을 출력해 보았다

interval로 매 월 갖는 날짜를 구해 start와 end를 구성하려고 했으나, 저장되어 있는 값에 따라 dayofmonth등은 달라지는 듯 하였다. (dt 값 중 4월의 최대는 4월 2일일 때, dayofmonth는 2가 된다)
지금보니… 달라지는 건 맞긴한데, group by를 month 기준으로 설정해놓아서 dt가 막무가내..(?)로 잡혀 값이 이상한 듯도 하고..

모든 날짜를 기준으로 찍어봤을때

그래서 그냥 last_day라는 내장함수를 사용하기로 했다~

이렇게 쉬운 것을

이제 쿼리가 적절한 유저와 작업등을 지칭할 수 있도록 설정하면 바로 쓸 수 있을 것 같다!


아참, 주간 통계에서 만약 주차에 저장된 로그가 없으면 해당 주의 결과를 리턴하지 않는데, 이는 일자 테이블을 만들어 해결하기로 하였다.

https://chobopark.tistory.com/167 빈 일자 테이블을 만드는 법

다만 char 배열로 담는 방법 대신, datetime을 사용하는 것이 더 빠르지 않을까 해서 (like 절로 찾으시길래) 조금 바꿨다.

고장이 난달까

그리고 내가 사용하는 것이 일간, 주간, 월간의 기능을 갖고 있기 때문에 각각에 맞는 date_format으로 나타내어 이들을 grouping 해주어야 한다.
생각나는대로 날짜 기준 테이블과 로그 테이블의 date를 기준으로 년-월-일로 표현시켜 join을 하였는데… 상당히 불편한 것을 느꼈다.

주어진 기간 내 월별 로그 조회 쿼리

그래서, 조건에 맞는 서브 쿼리 테이블과 날짜 테이블을 날짜 매핑에 맞게 join 한 후 해당 기간 내의 조건을 거는 것으로 쿼리를 완성했다.

주어진 기간 내 주간 로그 조회 쿼리

동일한 방법으로, 주간 로그도 조회가 가능하도록 한다.

카테고리:

업데이트: