Jooq按日/月/年比较时间戳

时间:2018-10-08 19:05:39

标签: java sql postgresql timestamp jooq

我正在尝试使用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)

2 个答案:

答案 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-012018-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();