5 votes

Comment utiliser la fonction to_char de Postgres dans une requête jOOQ ?

J'essaie de convertir la requête PostgreSQL suivante en 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

Ce que j'ai, c'est :

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

Existe-t-il un moyen de le faire en utilisant l'API fluide de jOOQ pour ne pas avoir à utiliser de chaînes de caractères ?

5voto

Lukas Eder Points 48046

Utilisation de TO_CHAR()

Il y a une demande de fonctionnalité en attente pour ajouter le support pour les fournisseurs spécifiques. to_char() fonctions : https://github.com/jOOQ/jOOQ/issues/8381

Afin de normaliser une telle fonction, des recherches supplémentaires doivent être effectuées pour s'assurer que nous pouvons couvrir tout ce que chaque fournisseur implémente ici, car la logique de formatage est malheureusement assez spécifique à chaque fournisseur, et typée de manière stricte.

Donc, si vous voulez utiliser to_char() pour l'instant, vous devrez vous contenter d'utiliser Modélisation SQL simple ce que vous avez déjà fait. Vous pourriez évidemment factoriser cet utilitaire sous une forme réutilisable, telle que :

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

Tronquer les dates

Bien sûr, dans votre requête particulière, vous pouvez également utiliser les fonctions SQL standard, telles que CAST() . I pensez à que ce que vous essayez de faire est de tronquer les informations temporelles de votre timestamp o timestamptz vous pouvez donc faire ceci à la place :

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

Ou avec jOOQ :

Field<Date> d = LOG.CREATED_DATE.cast(SQLDataType.DATE);

jooq.select(count(), d)
    .from(LOG)
    .groupBy(d)
    .orderBy(d)
    .fetch();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X