java - 使用 jOOQ 查找即将到来的生日

标签 java mysql sql date-arithmetic jooq

我正在尝试将查找即将到来的生日的现有查询转换为使用 jOOQ。我原来的查询 - 使用 MySQL,并进行了一些简化 - 是

SELECT COUNT(*) 
FROM people 
WHERE
    DATE_ADD(people_dob, INTERVAL YEAR(CURDATE()) - YEAR(people_dob) YEAR) 
    BETWEEN CURDATE() and DATE_ADD( CURDATE(), INTERVAL 7 DAY)

我尝试使用jOOQ表达它但失败了。我已经接近

context
    .selectCount()
    .from(PEOPLE)
    .where(
        PEOPLE_DOB.add(year(currentTimestamp()).minus(year(PEOPLE_DOB)))
        .between(currentTimestamp()).and(currentTimestamp().add(7)));

不幸的是,这转化为

select count(*) 
from `people` 
where 
    date_add(`people`.`people_dob`, interval (extract(year from current_timestamp()) - extract(year from `people`.`people_dob`)) day) 
    between current_timestamp() and date_add(current_timestamp(), interval 7 day)

这里破坏查询的是 [DATE_ADD][date_add] 的 expr_unit 参数,这是我的原始查询是 YEAR,但在 jOOQ 渲染的查询中是

如何将此查询转换为 jOOQ?我不太关心当前的格式,我只想了解如何获得相同的结果。

最佳答案

jOOQ 的 Field.add() 方法的灵感来自Oracle的解释

DATE + NUMBER

...哪里NUMBER (如果 IntegerDouble )是天数。你想要的相当于添加一个SQL标准INTERVAL YEAR TO MONTH到给定日期。这可以通过使用 jOOQ's YearToMonth interval type 来实现,如果您想添加一个恒定的间隔。 YearToMonth类型也扩展 java.lang.Number ,因此也可以与 Field.add() 一起使用,直观地。

虽然有可能生成这样的 Field<YearToMonth>通过现有的 jOOQ 3.2 API,我相信您最好只诉诸纯 SQL,可能通过创建可重用的方法:

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

这可能是 #2727 的一个有用的功能补充。还有...

不幸的是,各种 SQL 方言对日期时间算术的解释很难标准化。我们不断改进这方面的东西,但通常,纯 SQL 是编写特定于方言的日期时间算术表达式的最佳方式。

关于java - 使用 jOOQ 查找即将到来的生日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20703229/

相关文章:

mysql - LIKE 查询中的转义字段

mysql - 在 where 语句 mysql 上使用假列

java - Spring security @PreAuthorize SecurityExpressionRoot 或 PermissionEvaluator

java - 如何在使用 ScriptEngine 从 Java 运行 python 脚本时调用 python 脚本内的函数并传递参数

php - PDO 数据库类不会在捕获异常时停止

mysql - SQL 选择查询 where 列 LIKE

php - 将日期和时间输入转换为sql datetime

Java:看不到我的变量

java - Android ORMLite为库模型添加注解

MySQL:从 double 转换为十进制时精度损失