我正在尝试将查找即将到来的生日的现有查询转换为使用 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)
这里破坏查询的是expr_unit
[DATE_ADD][date_add] 的参数,这是我原来的查询是YEAR
,但是在jOOQ渲染的那个中是DAY
.
我怎样才能将这个查询翻译成jOOQ?我不太关心当前的格式,我只想了解如何获得相同的结果。
jOOQ's Field.add()该方法的灵感来自于 Oracle 的解释
DATE + NUMBER
... 在哪里NUMBER
(if an Integer
or Double
) 是天数。你想要的相当于添加一个SQL标准INTERVAL YEAR TO MONTH
到给定日期。这可以通过使用来实现jOOQ's YearToMonth区间型,如果您想添加一个恒定的间隔。这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 是编写特定于方言的日期时间算术表达式的最佳方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)