본문 바로가기
Kotlin

[QueryDSL] stringTemplate, dateTemplate로 날짜 포맷 하기, 날짜 더하기

by 고체물리학 2023. 7. 17.

날짜 형식 변경할 때

select문에서 DATE_FORMAT 함수를 사용하려면

Expressions.stringTemplate("DATE_FORMAT( {0}, {1} )", 변경할 값, 변경할 날짜 형식)

 

예)  createdAt 컬럼의 데이터를 "%Y-%m-%d %H:%i:%s"  형식으로 변경

fun date(cardNumber: String): String? {
        return queryFactory.select(
            Expressions.stringTemplate(
                "DATE_FORMAT( {0}, {1} )",
                createdAt,
                ConstantImpl.create("%Y-%m-%d %H:%i:%s")
            ).coalesce("")
        ).from(member).orderBy(member.id.desc()).fetchFirst()
            }

 

DATE 날짜, 시간 등을 더하거나 뺄 때

 

My SQL 구문 처럼 DATE_FORMAT 안에 DATE_ADD를 넣었더니 INTERVAL함수에서 계속 에러가 떴다

찾아보니 query dsl에서는 DATE_ADD를 사용하지 못한다고 되어있었다

 

시간함수를 먼저 더하거나 빼고 형식을 바꾸면 된다고 하는데 조회된 쿼리문을  date형식으로 들고 오기 위해서는 dateTemplate을 사용해야 했다

Expressions.dateTemplate(Date::class.java, "DATEADD(HOUR, {0},{1})", Expressions.asNumber(숫자), 변경할 값)

 

DATEADD에는 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 등 사용할 수 있다

https://learn.microsoft.com/ko-kr/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-ver16 

 

DATEADD(Transact-SQL) - SQL Server

DATEADD 함수의 Transact-SQL 참조입니다. 이 함수는 지정된 날짜 부분에서 수정된 날짜를 반환합니다.

learn.microsoft.com

 

예) member 테이블의 createdAt 컬럼의 날짜에서 9시간을 뺀 날짜

val formatTime = Expressions.dateTemplate(Date::class.java, "DATEADD(HOUR, {0},{1})", Expressions.asNumber(-9), member.createdAt)

 

여기서 다시 DATE_FORMAT을 사용해야 한다

Expressions.stringTemplate("DATE_FORMAT({0},{1})", formatTime, ConstantImpl.create("%Y-%m-%d %H:%i:%s"))

 

반응형

댓글