【问题标题】:How do I use Postgres's to_char in a jOOQ query?如何在 jOOQ 查询中使用 Postgres 的 to_char?
【发布时间】:2019-10-16 13:42:04
【问题描述】:

我正在尝试将以下 PostgreSQL 查询转换为 jOOQ:

SELECT count(*), to_char(created_date, 'YYYY-MM-DD') as year_month_date
  FROM log
  GROUP BY year_month_date
  ORDER BY year_month_date

我拥有的是:

jooq.select(
    DSL.count(),
    DSL.field("to_char(created_date, 'YYYY-MM-DD') as year_month_date")
  )
  .from(LOG)
  .groupBy(DSL.field("year_month_date"))
  .orderBy(DSL.field("year_month_date"))
  .fetch();

有没有办法使用 jOOQ 的 fluent API,这样我就不必使用字符串了?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    使用TO_CHAR()

    有一个待处理的功能请求以添加对供应商特定 to_char() 功能的支持:https://github.com/jOOQ/jOOQ/issues/8381

    为了标准化这样的功能,需要做更多的研究以确保我们可以涵盖每个供应商在这里实现的所有内容,因为不幸的是格式化逻辑是特定于供应商的,并且是字符串类型的。

    因此,如果您想使用to_char(),目前,您将不得不求助于您已经使用的plain SQL templating。您显然可以将该实用程序分解为可重用的形式,例如:

    public static Field<String> toChar(Field<?> date, String format) {
        return DSL.field("to_char({0}, {1})", SQLDataType.VARCHAR, date, DSL.inline(format));
    }
    

    截断日期

    当然,在您的特定查询中,您也可以使用标准 SQL 功能,例如 CAST()。我认为你想要做的是从你的timestamptimestamptz 列中截断时间信息,所以你可以这样做:

    SELECT count(*), CAST (created_date AS DATE) d
      FROM log
      GROUP BY d
      ORDER BY d
    

    或者使用 jOOQ:

    Field<Date> d = LOG.CREATED_DATE.cast(SQLDataType.DATE);
    
    jooq.select(count(), d)
        .from(LOG)
        .groupBy(d)
        .orderBy(d)
        .fetch();
    

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 1970-01-01
      • 2021-03-15
      • 2017-02-08
      • 1970-01-01
      • 2014-11-20
      • 2015-04-29
      • 2022-01-20
      相关资源
      最近更新 更多