Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Anstehende Geburtstage finden mit jOOQ

Feld von jOOQ .add() -Methode ist von Oracles Interpretation von

inspiriert
DATE + NUMBER

... wobei ZAHL (wenn eine Integer oder Doppelt ) ist eine Anzahl von Tagen. Was Sie wollen, ist das Äquivalent zum Hinzufügen eines SQL-Standards INTERVAL YEAR TO MONTH zu einem bestimmten Datum. Dies könnte durch die Verwendung von jOOQs YearToMonth Intervalltyp , wenn Sie ein konstantes Intervall hinzufügen möchten. Das YearToMonth type erweitert auch java.lang.Number , und kann somit auch mit Field.add() , intuitiv.

Es ist zwar möglich, ein solches Field zu generieren Durch die vorhandene jOOQ 3.2-API glaube ich, dass Sie besser dran sind, einfach auf einfaches SQL zurückzugreifen, möglicherweise durch die Erstellung einer wiederverwendbaren Methode:

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

Dies könnte eine nützliche Funktionserweiterung für #2727 sein auch...

Leider ist die Interpretation der Datums-Zeit-Arithmetik durch die verschiedenen SQL-Dialekte schwer zu standardisieren. Wir verbessern die Dinge dort ständig, aber häufig ist einfaches SQL der beste Weg, um dialektspezifische arithmetische Ausdrücke für Datum und Uhrzeit zu schreiben.