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

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

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

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

 

개요

이번 글에서는 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
728x90

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