我正在尝试使用jooq进行时间戳之间的比较。我需要确定两个时间戳是否在同一天/每月/每年。
要在jpql中做到这一点,我使用了day()
/ month()
/ year()
/ hour()
方法。
我尝试使用Field.compare(Comparator, Field)
方法,但是它不使用标准的Java比较器,而是使用Jooq的枚举。
jpql中的一个例子是
SELECT s from Service s WHERE day(s.serviceDate) = day(s.createdAt) and
month(s.serviceDate) = month(s.createdAt)
答案 0 :(得分:3)
day()
和month()
函数 Your own solution是绝对正确的,但是请注意,您也可以使用便捷方法DSL.day()
和DSL.month()
:
ctx.select()
.from(SERVICE)
.where(day(SERVICE.SERVICE_DATE).eq(day(SERVICE.CREATED_AT)))
.and(month(SERVICE.SERVICE_DATE).eq(month(SERVICE.CREATED_AT)))
.fetch();
但是,您的实际问题是另外一个问题:
我需要确定两个时间戳记是否在同一天/每月/每年。
您可能还应该包括年份。否则,不同年份中同一日期的两个时间戳将匹配,例如2017-01-01
和2018-01-01
。这是使用DSL.trunc()
的替代方法:
ctx.select()
.from(SERVICE)
.where(trunc(SERVICE.SERVICE_DATE).eq(trunc(SERVICE.CREATED_AT)))
.fetch();
与往常一样,以上假设您正在使用以下静态导入
import static org.jooq.impl.DSL.*;
答案 1 :(得分:1)
执行此操作的方法是使用extract方法并提供DatePart枚举。
例如
Condition dayCondition = SERVICE.SERVICE_DATE.extract(DatePart.DAY)
.eq(SERVICE.CREATED_AT.extract(DatePart.DAY);
Condition monthCondition = SERVICE.SERVICE_DATE.extract(DatePart.MONTH)
.eq(SERVICE.CREATED_AT.extract(DatePart.MONTH);
dslContext.select()
.from(SERVICE)
.where(dayCondtion.and(monthCondition)).fetch();