2012-04-08 1 views
9

Я пытаюсь выяснить время между определенными полями в моих таблицах. Однако причина, почему я использую Postgresql : (() Я не могу использовать функцию DATEDIFF. Я не могу найти какие-либо четкие руководства/учебные пособия в сети, которые показывают, как сделать подобное в Postgres, поэтому мне нужна помощь в выполнении то же самое, но в PostgresРасчет разницы дат В Postgresql

Я предполагаю, что этот запрос будет работать, если я использую СУБД, которая поддерживает функцию DATEDIFF поэтому в основном мой вопрос, как я могу изменить это так работает, используя возможности, предоставляемые Postgresql?

SELECT Question.ID, 
Question.Status, COUNT (qUpdate.ID) AS NumberofUpdates, 
DATEDIFF (Question.LoggedTime,MIN(qUpdate.UpdateTime)) AS TimeBeforeFirstUpdate, 
DATEDIFF(Question.LoggedTime, MAX(qUpdate.UpdateTime)) AS TimeBeforeLastUpdate 
FROM qUpdate 
LEFT JOIN Question ON qUpdate.qID=Question.ID 
WHERE Question.Status = 'closed' AND qUpdate.Update NOT NULL 
GROUP BY Question.Status, Question.ID, Question.LoggedTime; 

Если вам нужна дополнительная информация или какие-либо разъяснения я responsd как можно скорее.

+3

Postgres - очень многофункциональный объект. Это действительно стоит прочитать в руководстве. – Glenn

+0

Извините, мне никогда не показывали это раньше. Я определенно буду смотреть на это с этого момента :) – Jimmy

ответ

12

Yo u не нужна функция «датированный».

Просто вычесть две даты:

Question.LoggedTime - MIN(qUpdate.UpdateTime) 

В случае, если вы не знаете, но все, что документируется онлайн:
http://www.postgresql.org/docs/current/static/functions-datetime.html

+1

И все это время я боролся с возрастной функцией: / – itsols

3

Вы можете использовать функцию age(<date1>, <date2>) (вместо DATEDIFF) ,

Это должно работать -

SELECT Question.ID, 
Question.Status, COUNT (qUpdate.ID) AS NumberofUpdates, 
age(Question.LoggedTime,MIN(qUpdate.UpdateTime)) AS TimeBeforeFirstUpdate, 
age(Question.LoggedTime, MAX(qUpdate.UpdateTime)) AS TimeBeforeLastUpdate 
FROM qUpdate 
LEFT JOIN Question ON qUpdate.qID=Question.ID 
WHERE Question.Status = 'closed' AND qUpdate.Update NOT NULL 
GROUP BY Question.Status, Question.ID, Question.LoggedTime; 

Примечание, если PSQL дает эту ошибку - ERROR: date/time field value out of range, то вам нужно будет выбрать соответствующий datestyle.

2
SELECT extract(year from age('2014-01-23', '1985-08-27')); 
-- returns 28 years, my current age.