2012-04-08 59 views
9

Tôi đang cố gắng tìm ra thời gian giữa các trường nhất định trong các bảng của tôi. Tuy nhiên, vì tôi đang sử dụng Postgresql : (( Tôi không thể sử dụng hàm DATEDIFF. Tôi không thể tìm thấy bất kỳ hướng dẫn/hướng dẫn rõ ràng nào trên mạng cho thấy cách thực hiện điều tương tự trong Postgres vì ​​vậy tôi cần trợ giúp thực hiện điều tương tự nhưng trong PostgresTính toán sự khác biệt của các ngày Trong Postgresql

tôi giả định truy vấn này sẽ làm việc nếu tôi đã sử dụng một RDBMS mà hỗ trợ các chức năng DATEDIFF nên về cơ bản câu hỏi của tôi là làm thế nào tôi có thể thay đổi điều này để nó hoạt động sử dụng các tính năng được cung cấp bởi 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; 

Nếu bạn cần thêm thông tin hoặc làm rõ, tôi sẽ trả lời càng sớm càng tốt.

+3

Postgres rất giàu tính năng. Nó thực sự đáng đọc qua sách hướng dẫn. – Glenn

+0

Xin lỗi tôi chưa bao giờ được hiển thị trước đó. Tôi chắc chắn sẽ xem xét nó từ bây giờ :) – Jimmy

Trả lời

12

Yo u không cần một chức năng "dateiff".

Chỉ trừ hai ngày:

Question.LoggedTime - MIN(qUpdate.UpdateTime) 

Trong trường hợp bạn không biết, nhưng tất cả những gì được ghi chép trực tuyến:
http://www.postgresql.org/docs/current/static/functions-datetime.html

+1

Và tôi đã đấu tranh với chức năng tuổi tất cả thời gian này: / – itsols

3

Bạn có thể sử dụng chức năng age(<date1>, <date2>) (thay vì DATEDIFF) .

này nên làm việc -

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; 

Lưu ý, nếu psql mang đến cho bạn lỗi này - ERROR: date/time field value out of range, sau đó bạn sẽ cần phải chọn một thích hợp datestyle.

2
SELECT extract(year from age('2014-01-23', '1985-08-27')); 
-- returns 28 years, my current age. 
Các vấn đề liên quan