如何在jOOQ查询中使用Postgres的to_char?

时间:2019-05-30 21:49:45

标签: java sql jooq

我正在尝试将以下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的流畅API,所以我不必使用字符串?

1 个答案:

答案 0 :(得分: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();