【问题标题】:Jooq compare timestamps by day/month/yearJooq 按日/月/年比较时间戳
【发布时间】:2019-03-13 11:57:43
【问题描述】:

我正在尝试使用 jooq 对时间戳进行比较。我需要确定这 2 个时间戳是否在同一天/月/年。

要在 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)

【问题讨论】:

    标签: java sql postgresql timestamp jooq


    【解决方案1】:

    使用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();
    

    您的实际问题

    但是,您的实际问题是另一个问题:

    我需要确定这 2 个时间戳是否在同一天/月/年。

    您可能也应该包括年份。否则,不同年份同一日期的两个时间戳将匹配,例如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.*;
    

    【讨论】:

    • 谢谢,这给了我 2 种不同的 JOOQ 方法,我绝对可以看到自己在使用这些方法。不幸的是,DSL.trunc() 方法在我的情况下不起作用,因为我们必须处理时区,所以我的hour() 逻辑是必需的,没有意识到这对这个问题很重要,但很高兴你提供了这两个选项
    【解决方案2】:

    执行此操作的方法是使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多