Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Encontrando os próximos aniversários com jOOQ


jOOQ Campo .adicionar() é inspirado na interpretação da Oracle de
DATE + NUMBER

... onde NUMBER (se um Inteiro ou Duplo ) é um número de dias. O que você quer é o equivalente a adicionar um padrão SQL INTERVAL YEAR TO MONTH a uma determinada data. Isso pode ser feito usando jOOQ YearToMonth tipo de intervalo , se você quiser adicionar um intervalo constante. O AnoParaMês type também estende java.lang.Number , e também pode ser usado com Field.add() , intuitivamente.

Embora seja possível gerar um Field através da API jOOQ 3.2 existente, acredito que será melhor recorrer apenas ao SQL simples, possivelmente criando um método reutilizável:
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);
}

Isso pode ser uma adição de recurso útil para #2727 também...

Infelizmente, as interpretações dos vários dialetos SQL da aritmética de data e hora são difíceis de padronizar. Estamos constantemente melhorando as coisas lá, mas muitas vezes, o SQL simples é a melhor maneira de escrever expressões aritméticas de data e hora específicas do dialeto.