2011-10-17 15 views
25

Tengo una relación que mantiene los datos históricos mensuales. Esta información se agrega a la tabla el último día de cada mes. Un servicio que estoy escribiendo se puede llamar especificando un mes y varios meses antes para recuperar los datos históricos. Estoy haciendo esto creando variables startDate y endDate, y luego devolviendo datos entre los dos. El problema que tengo es que startDate es una cantidad variable de meses antes de endDate, y no puedo entender cómo usar un período variable en un intervalo.Uso de un período variable en un intervalo en Postgres

Aquí es lo que tengo:

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

sé que la línea de startDate no es correcto. ¿Cómo se hace esto correctamente?

Respuesta

57

uso de esta línea:

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

y tenga en cuenta el espacio antes de MONTH. Básicamente: construyes una cadena con 4 MONTH y lo lanzas con ::type en un intervalo adecuado.

Editar: I' han encontrado otra solución: Se puede calcular con interval así:

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

Esto se ve un poco más agradable para mí.

+0

Esto funcionó a la perfección. ¡Gracias por la ayuda! – Belizzle

+3

O: 'endDate - '1 mon' :: interval * $ 3' (menos fundición y concatenación) –

+0

Paralelo de pensamiento :-) –

3

Este código no tiene nada que ver directamente con su situación, pero sí ilustra cómo usar variables en la aritmética INTERVAL. El nombre de mi mesa es "calendario".

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; 
Cuestiones relacionadas