Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trouver les anniversaires à venir avec jOOQ

Champ .add() méthode est inspirée de l'interprétation d'Oracle de

DATE + NUMBER

... où NOMBRE (si un Entier ou Double ) est un nombre de jours. Ce que vous voulez est l'équivalent de l'ajout d'un standard SQL INTERVAL YEAR TO MONTH à une date donnée. Cela pourrait être réalisé en utilisant YearToMonth type d'intervalle , si vous vouliez ajouter un intervalle constant. Le YearToMonth le type étend également java.lang.Number , et peut donc également être utilisé avec Champ.add() , intuitivement.

Bien qu'il soit possible de générer un tel Field grâce à l'API jOOQ 3.2 existante, je pense que vous feriez mieux de recourir simplement au SQL brut, éventuellement en créant une méthode réutilisable :

public static <T extends java.util.Date> 
Field<T> dateInCurrentYear(Field<T> field) {
    return DSL.field("DATE_ADD({0}, INTERVAL YEAR(CURDATE()) - YEAR({0}) YEAR)",
                     field.getDataType(),
                     field);
}

Cela pourrait être un ajout de fonctionnalité utile pour #2727 aussi...

Malheureusement, les interprétations des différents dialectes SQL de l'arithmétique date-heure sont difficiles à standardiser. Nous améliorons constamment les choses, mais souvent, le SQL simple est le meilleur moyen d'écrire des expressions arithmétiques de date et d'heure spécifiques au dialecte.