在JOOQ中获取两个日期之差的总和

时间:2019-04-17 05:09:42

标签: postgresql jooq

我正在使用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)函数,但是由于总和用于数字,因此给出了编译时错误。 在这里,我正在计算两个日期的差值的总和(差异)。

1 个答案:

答案 0 :(得分:0)

当使用-运算符实现日期差时,所有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很容易。