#postgresql #jooq
#postgresql #jooq
Вопрос:
Я использую 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, КАК показано ниже:
последняя строка 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);
Но я не могу получить совокупную сумму «разницы» (разницы дат).Есть ли в JOOQ какая-либо функция, которая может преобразовать оператор sql «select sum (workevents.diff)» в JOOQ.
Я пробовал функцию sum (field), но она выдает ошибку во время компиляции, потому что sum используется для чисел. и здесь я вычисляю накопительную сумму разницы двух дат (diff).
Ответ №1:
Все СУБД ведут себя немного по-разному при реализации разницы дат с помощью -
оператора, поэтому обычно рекомендуется использовать DSL.dateDiff()
DSL.timestampDiff()
вместо jOOQ или.
Дополнительная заметка об использовании 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.