Querydsl에서 datetime을 DATE_FORMAT 하여 사용하는 방법 ( Spring Boot / Querydsl /  Java / MySQL )
🌜 Database

Querydsl에서 datetime을 DATE_FORMAT 하여 사용하는 방법 ( Spring Boot / Querydsl / Java / MySQL )

728x90

안녕하세요. 그린주입니다 ๑'ٮ'๑

오늘도 힘차게 시작해보겠습니다!

 

개요

이번 글에서는 Querydsl에서 datetime을 date로 format 하여 select와 groupBy에 사용하는 방법에 대해 공유해드리겠습니다.


목차

Date Format

Select와 GroupBy


Date Format

member 테이블의 reg_date 타입은 datetime입니다. 이 데이터를 가지고 날짜별로 조회하려고 할 때 Querydsl에서 date로 format 하여 select와 groupBy에 삽입해주는 과정입니다.

 

Querydsl에서 datetime을 date로 format 하려면 SQL Function인 "Expressions.stringTemplate()" 또는 "Expressions.dateTemplat()"을 사용합니다.

(원본) 2022-04-23 03:12:00 => (원하는 포맷) 2022-04-23

 

stringTemplate()과 dateTemplat()는 공통적으로 MySQL 문법이 사용되기 때문에 MySQL 문법부터 알려드리겠습니다.

MySQL에서 DATE_FORMAT() 사용

MySQL에서 date를 format 하는 방법은 아래와 같습니다.

DATE_FORMAT('2022-04-23 03:12:00', '%Y-%m-%d');
DATE_FORMAT('변경할 값', '변경할 양식');

// 결과
2022-04-23

Querydsl에서 stringTemplate() 사용

StringTemplate formattedDate = Expressions.stringTemplate(
                "DATE_FORMAT({0}, {1})"
                , member.regDate
                , ConstantImpl.create("%Y-%m-%d"));
                
// 쿼리로 표현한다면
SELECT DATE_FORMAT(a.reg_date, '%Y-%m-%d') FROM member a;

  Expressions.stringTemplate(MySQL 문법, 변경할 값, 변경할 양식)

 

첫 번째 인자는 MySQL 문법 DATE_FORMAT({0}, {1})

두 번째는 칼럼명 / 변경할 값({0}에 들어갈 값)

세 번째는 format 할 유형 / 변경할 양식을 입력합니다.

 


Querydsl에서 dateTemplate() 사용

StringTemplate formattedDate = Expressions.dateTemplate(
                String.class
                , "DATE_FORMAT({0}, {1})"
                , member.regDate
                , ConstantImpl.create("%Y-%m-%d"));

  Expressions.stringTemplate(표현 유형, MySQL 문법, 변경할 값, 변경할 양식)

 

첫 번째 인자는 표현식 유형으로 responseDto에서 regDate 타입을 String으로 했기 때문에 저는 String.class로 적용했습니다.

두 번째, 세 번째, 네 번째는 1번에서 설명한 stringTemplate과 동일합니다. 

 


Select와 GroupBy

Template 방법 중 하나를 사용해서 formattedDate를 만들었다면 select와 groupBy에 사용하는 방법은 아주 간단합니다.

queryFactory.select(Projections.fields(MemberResponseDto.class,
		formattedDate
		, member.id
	))
		.from(member)
		.groupBy(formattedDate)
		.fetch();

아래와 같이 쿼리문이 나오고 날짜별로 조회되는 걸 확인할 수 있습니다.

select
        date_format(charge0_.trad_date,
        ?) as col_0_0_,
	member0_.id as col_1_0_
from
	member member0_ 
group by
	date_format(member0_.reg_date,
	?)
[TRACE] o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [%Y-%m-%d]
728x90

마무리

이렇게 Querydsl에서 datetime을 date로 format 하여 select와 groupBy에 사용하는 방법에 대해 알아보았습니다.

다들 성공하셨을까요?? 끝까지 파이팅입니다!

 

긴 글 봐주셔서 감사합니다!
오늘도 행복한 하루 보내세요 ✿'◡'✿


참고

[querydsl, mysql] DATE_FORMAT 등 이용해 groupby 사용하기

QueryDSL StringTemplate 사용

실무 도중 Template 이슈


728x90
728x90