【问题标题】:Get aggregate sum of difference of two dates in JOOQ在JOOQ中获取两个日期的差的总和
【发布时间】:2019-09-07 06:32:48
【问题描述】:

我正在使用 JOOQ 在我的 java 代码中编写 SQL。我在 PostgreSQL 数据库中写入了以下查询:' 查询:获取检查任务的总数和完成任务所用的总时间。 一项任务的总时间是通过执行 (endtime-starttime) 从表“workevents”中计算出来的。但这里我获取的是所有任务所花费的总时间。

      with taskdata as (
        select taskid from unittest.tasks 
        where projectname='test'and status='checked'
        ),

      workevents as(
        select (endtime-starttime) diff ,unittest.workevents.taskid as 
        workeventtaskid from unittest.workevents ,taskdata 
        where taskdata.taskid=unittest.workevents.taskid
         )

      select sum(workevents.diff),count(distinct workeventtaskid) from 
      workevents;

我已经把它转换成下面的jooQ AS了:

最终字符串 sql =

            with(TASK_INFO_WRAPPER)              
            .as(select(TASK_ID).from(TASK_TABLE)                
            .where(PROJECT_NAME.eq(param()).and(TASK_STATUS.eq("checked"))))

            .with(WORKEVENT_INFO_WRAPPER)                            
           .as(select(TASK_END_TIME.sub(TASK_START_TIME).as("diff"),
           WORKEVENT_TASK_ID.as("workeventtaskid"))
                    .from(WORKEVENT_TABLE, table(name(TASK_INFO_WRAPPER)))
                    .where("workeventinfo.taskid=taskinfo.taskid"))
            .select().getSQL(ParamType.INDEXED);

但是我无法得到“diff”的总和(日期的差异)。JOOQ 中有没有可以将 sql 语句“select sum(workevents.diff)”转换为 JOOQ 的函数。

我尝试过 sum(field) 函数,但它给出了编译时错误,因为 sum 用于数字。 这里我计算的是两个日期差的累计和(diff)。

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    在使用 - 运算符实现日期差异时,所有 RDBMS 的行为都略有不同,这就是为什么通常建议使用 jOOQ 的 DSL.dateDiff()DSL.timestampDiff() 来代替。

    关于使用WITH 的附注

    WITH 通常用于在 SQL 中将问题分解为更小的问题。但在某些时候,这种分解会导致比必要的更复杂的查询,就像你的情况一样。尤其是在使用 jOOQ 时,通常建议避免使用公用表表达式 (WITH) 或派生表,不仅因为它们在 jOOQ 中表达起来有点困难,而且因为它们并没有真正为您的查询。

    您的查询可以这样写:

    select 
      sum(e.endtime - e.starttime),
      count(distinct e.taskid)
    from unittest.tasks t
    join unittest.workevents e on t.taskid = e.taskid
    where t.projectname = 'test' and t.status = 'checked'
    

    这显然更容易转化为 jOOQ。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2022-01-01
      • 2018-11-08
      • 1970-01-01
      • 2020-06-05
      • 2020-03-22
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多