Получить общую сумму разницы двух дат в JOOQ - PullRequest
1 голос
/ 17 апреля 2019

Я использую JOOQ для написания SQL в своем коде Java. У меня есть следующий запрос, записанный в базу данных PostgreSQL: 'Запрос: извлекает общее количество проверенных задач и общее время, затраченное на выполнение задач.Общее время для задачи вычисляется из таблицы "workevents" следующим образом (endtime-starttime). Но здесь я получаю общее время, потраченное на все задачи.

      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КАК ниже:

final String 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 используется для чисел.и здесь я вычисляю накопительную сумму разности двух дат (разность).

1 Ответ

0 голосов
/ 18 апреля 2019

Все СУБД ведут себя немного по-разному при реализации разницы дат с помощью оператора -, поэтому обычно рекомендуется использовать вместо 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.

...