2011-10-17 70 views
25

Tôi có một mối quan hệ duy trì dữ liệu lịch sử hàng tháng. Dữ liệu này được thêm vào bảng vào ngày cuối cùng của mỗi tháng. Một dịch vụ tôi viết sau đó có thể được gọi là xác định một tháng và một số tháng trước đó để truy xuất dữ liệu lịch sử. Tôi đang làm điều này bằng cách tạo các biến startDate và endDate, sau đó trả về dữ liệu giữa hai biến. Vấn đề tôi gặp phải là startDate là một số biến của tháng trước endDate, và tôi không thể tìm ra cách sử dụng một khoảng thời gian biến trong một khoảng thời gian.Sử dụng một khoảng thời gian thay đổi trong một khoảng thời gian trong Postgres

Dưới đây là những gì tôi có:

DECLARE 
     endDate TIMESTAMP := (DATE_TRUNC('MONTH',$2) + INTERVAL '1 MONTH') - INTERVAL '1 DAY'; 
     startDate TIMESTAMP := endDate - INTERVAL $3 'MONTH'; 

Tôi biết rằng dòng cho STARTDATE là không đúng. Làm thế nào là điều này đúng cách?

Trả lời

57

Sử dụng dòng này:

startDate TIMESTAMP := endDate - ($3 || ' MONTH')::INTERVAL; 

và lưu ý các không gian trước khi MONTH. Về cơ bản: Bạn xây dựng một chuỗi có dạng như 4 MONTH và bỏ nó bằng ::type vào một khoảng thời gian thích hợp.

Sửa: Tôi đã tìm thấy một giải pháp khác: Bạn có thể tính toán với interval như thế này:

startDate TIMESTAMP := endDate - $3 * INTERVAL '1 MONTH'; 

này trông một chút đẹp hơn đối với tôi.

+0

Điều này hoạt động hoàn hảo. Cảm ơn bạn vì sự giúp đỡ! – Belizzle

+3

Hoặc: 'endDate - '1 mon' :: interval * $ 3' (ít casting & concatenating) –

+0

Suy nghĩ song song :-) –

3

Mã này không có gì liên quan trực tiếp đến tình huống của bạn, nhưng nó minh họa cách sử dụng các biến trong số học INTERVAL. Tên bảng của tôi là "lịch".

CREATE OR REPLACE FUNCTION test_param(num_months integer) 
    RETURNS SETOF calendar AS 
$BODY$ 

    select * from calendar 
    where cal_date <= '2008-12-31 00:00:00' 
    and cal_date > date '2008-12-31' - ($1 || ' month')::interval; 

$BODY$ 
    LANGUAGE sql VOLATILE 
    COST 100 
    ROWS 1000; 
Các vấn đề liên quan