我正在尝试将查找即将到来的生日的现有查询转换为使用 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
(如果 Integer
或 Double
)是天数。你想要的相当于添加一个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/