Использование переменного периода в интервале в Postgres - PullRequest
40 голосов
/ 17 октября 2011

У меня есть отношение, которое поддерживает ежемесячные исторические данные. Эти данные добавляются в таблицу в последний день каждого месяца. Сервис, который я пишу, может быть вызван с указанием месяца и количества месяцев, за которые нужно извлечь исторические данные. Я делаю это, создавая переменные startDate и endDate, а затем возвращая данные между ними. У меня проблема в том, что startDate - это переменное число месяцев до endDate, и я не могу понять, как использовать переменный период в интервале.

Вот что у меня есть:

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

Я знаю, что строка для startDate неверна. Как это правильно сделать?

Ответы [ 2 ]

77 голосов
/ 17 октября 2011

Используйте эту строку:

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

и запишите пробел перед MONTH.По сути: вы строите строку с 4 MONTH и приводите ее с ::type в соответствующий интервал.

Редактируйте : я нашел другое решение: вы можете вычислить с помощью interval вот так:

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

Это выглядит немного лучше для меня.

6 голосов
/ 17 октября 2011

Этот код не имеет прямого отношения к вашей ситуации, но он иллюстрирует, как использовать переменные в арифметике INTERVAL.Моя таблица называется "календарь".

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;
...