2015-06-23 7 views
3

У меня есть объект с объектом Date, представляющим последнее действие. Я хотел бы запросить среднее время простоя. Таким образом, в SQL-то вроде:Средняя разница в дате в QueryDSL

SELECT AVG(NOW() - idle_date) FROM mytable WHERE .... 

Я пытался вычислить разницу так:

query.singleResult(
    Expressions.dateOperation(
     Long.class, 
     Ops.DateTimeOps.DIFF_SECONDS, 
     DateExpression.currentDate(), 
     myTable.idleDate 
    ) 
); 

Но это не позволяет мне делать в среднем на результат, только мин и макс.

Как я могу выразить это среднее значение по разнице дат/времени (в секундах)?

ответ

0

Я считаю, вы могли бы использовать объект NumberTemplate; что-то в этом направлении должно делать то, что вам нужно: NumberTemplate.create(Double.class, "AVG(NOW() - {0})", myTable.idleDate);

+1

Я использовал 'NumberTemplate.create (Double.class," {0} - {1} ", DateExpression.currentDate(), myTable.idleSince) .avg()' и это прекрасно работает. (Я взял на себя смелость отредактировать ваш комментарий, чтобы я мог отметить его как правильное решение) –

+0

На самом деле, это не работает должным образом. Этот код дает числовой результат, но он не имеет смысла и, конечно же, не является числом секунд. Я попытался заменить {0} - {1} на TIMESTAMPDIFF (SECOND, {1}, {0}), но это не является выражением JPA и поэтому терпит неудачу. –

+0

Является ли 'idleDate' представленным как' java.sql.Timestamp' или 'java.sql.Date'? Если это 'java.sql.Timestamp', есть' DateTimeExpression.currentDate() ', который может помочь. В качестве альтернативы, возможно, можно использовать 'DateTemplate' и обрабатывать результат, как только вы получите его на стороне Java. Извините, это не сработало. –