Mysql
 sql >> Database >  >> RDS >> Mysql

Trovare i prossimi compleanni con jOOQ

Campo di jOOQ .add() si ispira all'interpretazione di Oracle di

DATE + NUMBER

... dove NUMERO (se un Intero o Doppio ) è un numero di giorni. Quello che vuoi è l'equivalente di aggiungere uno standard SQL INTERVAL YEAR TO MONTH ad una data data. Ciò può essere ottenuto utilizzando YearToMonth tipo di intervallo , se si desidera aggiungere un intervallo costante. Il AnnoToMese type estende anche java.lang.Number , e può quindi essere utilizzato anche con Field.add() , intuitivamente.

Anche se potrebbe essere possibile generare un tale Field attraverso l'API jOOQ 3.2 esistente, credo che sarà meglio ricorrere al semplice SQL, possibilmente creando un metodo riutilizzabile:

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

Questa potrebbe essere un'utile aggiunta di funzionalità per #2727 anche...

Sfortunatamente, le interpretazioni dei vari dialetti SQL dell'aritmetica della data e dell'ora sono difficili da standardizzare. Qui miglioriamo costantemente le cose, ma spesso un semplice SQL è il modo migliore per scrivere espressioni aritmetiche di data e ora specifiche del dialetto.