为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2022-12-28 09:46:53
我正在尝试将以下 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 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

使用TO_CHAR()

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


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


所以,如果你想使用to_char(),目前,你将不得不求助于使用普通的 SQL 模板,你已经这样做了。您显然可以以可重用的形式分解出该实用程序,例如:


public static Field<String> toChar(Field<?> date, String format) {

    return DSL.field("to_char({0}, {1})", SQLDataType.VARCHAR, date, DSL.inline(format));

}

截断日期

当然,在您的特定查询中,您也可以求助于使用标准 SQL 功能,例如CAST(). 我认为您要做的是从您的timestamportimestamptz列中截断时间信息,因此您可以改为这样做:


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


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号