You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin使用jOOQ SQL构造器基于Date对象添加日期范围where查询条件

实现方案

核心逻辑

jOOQ原生支持java.util.Date类型作为查询参数,你只需要将目标时间列显式声明为Date类型的jOOQ字段,直接调用between方法传入你已有的Date对象即可,框架会自动处理参数绑定、类型适配,不需要手动格式化日期字符串。

前置修正

你原有代码里的日期格式化存在错误:yyyy-mm-dd中的mm代表分钟,月份需要用大写的MM,否则会出现日期解析错误,需要先修正这部分。

修正后的完整代码

import org.jooq.*
import org.jooq.impl.DSL
import java.text.SimpleDateFormat
import java.time.Instant
import java.util.*

// 修正日期格式化符,mm改MM
val format = SimpleDateFormat("yyyy-MM-dd")
format.timeZone = TimeZone.getTimeZone("UTC")
val defaultValueLower = format.parse("1970-01-01")
val defaultValueUpper = Date.from(Instant.now())

val create = DSL.using(SQLDialect.POSTGRES)
val query: Query = create.select()
    .from(DSL.table("datasets"))
    // 新增where条件,指定timestamp字段为Date类型,传入已有的Date对象做区间筛选
    .where(DSL.field("timestamp", Date::class.java).between(defaultValueLower, defaultValueUpper))
    .orderBy(DSL.field("id").desc())
    .limit(DSL.inline(100))

拓展说明

  • 上述代码的between是闭区间逻辑,如果你需要左闭右开区间(比如排除结束日期零点之后的数据),可以替换成如下写法:
    .where(
        DSL.field("timestamp", Date::class.java).ge(defaultValueLower)
        .and(DSL.field("timestamp", Date::class.java).lt(defaultValueUpper))
    )
    
  • 如果你使用的是jOOQ 3.14+版本,也可以直接用Java 8+的时间类(比如Instant、LocalDateTime)替换Date,只需要对应修改字段声明的类型即可。

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:09:02