개발/Spring

Querydsl 에서 datetime과 date 비교하기

희묭 2023. 7. 10. 18:57

일단 가장 좋은 방법은 일시와 일자를 비교할일이 없는게 베스트이다.
그러나 현실에서는 일자와 일시를 비교할 일이 많으며, 비교대상중 하나가 상수인경우는 쉽게 해결될것이다.
 
문제는 둘다 엔티티화 되어있는 경우인데
이런경우 가장 먼저 아래와 같은 해결책을 제시할 수 있다.

.on(Expressions.dateTemplate(LocalDate.class, "DATE_FORMAT({0}, {1})", a.orderDatetime, "%Y-%m-%d")
.between(b.startDate, b.endDate))

그러나 이런 방법에는 문제가 있다.
MySQL에서는 아무 문제없이 작동할 수 있지만 다른 데이터베이스로 마이그레이션할 일이 있다면 DATE_FORMAT 함수가 부메랑으로 날아온다.
의외로 그런 문제는 빠르게 부딪히는데 바로 H2등의 데이터베이스로 테스트를 하는경우이다.
 
이런경우 어떻게 해결하는 편이 가장 좋을까?
만약 DATE로 몰아서 검색해도 상관없다면 아래와 같은 방법도 가능하다.

a.orderDatetime.year().multiply(10000).add(a.orderDatetime.month().multiply(100)).add(a.orderDatetime.dayOfMonth())
.between(
        b.startDate.year().multiply(10000).add(b.startDate.month().multiply(100)).add(b.startDate.dayOfMonth()),
        b.endDate.year().multiply(10000).add(b.endDate.month().multiply(100)).add(b.endDate.dayOfMonth())
)

년,월,일을 숫자로만들어 비교하는것이다.
 
다시말하지만 이런 비교를 할 필요가 없는게 최선책이다.
그러나 현실에서는 도메인끼리 이런 디테일을 완벽하게 조율을 할 수도 없기에 이런 비교를 해야될 일이 종종 발생한다.

'개발 > Spring' 카테고리의 다른 글

[Swagger] Request가 Map인 경우 Controller 작성법  (0) 2023.11.01
Description 을 사용하자  (0) 2023.06.20