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