sql >> Base de Datos >  >> RDS >> Mysql

Encontrar los próximos cumpleaños con jOOQ

Field de jOOQ .add() El método está inspirado en la interpretación de Oracle de

DATE + NUMBER

... donde NÚMERO (si es un Integer o Doble ) es un número de días. Lo que desea es el equivalente de agregar un estándar SQL INTERVALO DE AÑO A MES a una fecha dada. Esto podría lograrse mediante el uso de YearToMonth tipo de intervalo , si desea agregar un intervalo constante. El AñoAMes type también extiende java.lang.Number , y por lo tanto también se puede usar con Campo.añadir() , intuitivamente.

Si bien podría ser posible generar tal Field a través de la API jOOQ 3.2 existente, creo que será mejor que recurra a SQL simple, posiblemente creando un método reutilizable:

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

Esta podría ser una función adicional útil para #2727 también...

Desafortunadamente, las interpretaciones de la aritmética de fecha y hora de los diversos dialectos SQL son difíciles de estandarizar. Estamos constantemente mejorando las cosas allí, pero a menudo, SQL simple es la mejor manera de escribir expresiones aritméticas de fecha y hora específicas del dialecto.