Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与jOOQ一起寻找即将到来的生日_Java_Mysql_Sql_Date Arithmetic_Jooq - Fatal编程技术网

Java 与jOOQ一起寻找即将到来的生日

Java 与jOOQ一起寻找即将到来的生日,java,mysql,sql,date-arithmetic,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来表达它,但失

我正在尝试将一个查找即将到来的生日的现有查询转换为使用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\u ADD][DATE\u ADD]的
expr\u unit
参数,这是我最初的查询是
YEAR
,但jOOQ呈现的查询是
DAY


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

解决此问题的一种方法是在where子句中使用字符串。我写在这里是为了完整,但我认为它没有抓住jOOQ的要点

context.
    selectCount().
    from(PEOPLE).
    where("DATE_ADD(people_dob, INTERVAL YEAR(CURDATE()) - YEAR(people_dob) YEAR)" + 
        " BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()").
jOOQ的方法受到甲骨文对

DATE + NUMBER
。。。其中
NUMBER
(如果是
整数
双精度
)是天数。您所需要的相当于将SQL标准
从年到月的间隔添加到给定日期。这可以通过使用来实现,如果您想添加一个恒定的间隔。
YearToMonth
类型还扩展了
java.lang.Number
,因此可以直观地与一起使用

虽然可以通过现有的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);
}
公共静态
字段日期发生年份(字段){
返回DSL.field(“DATE_ADD({0},INTERVAL YEAR(CURDATE())-YEAR({0})YEAR)”,
field.getDataType(),
字段);
}
这可能是一个有用的功能添加以及

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