Подтвердить что ты не робот

Использование переменной периода в интервале в Postgres

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

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

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

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

4b9b3361

Ответ 1

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

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

и заметьте пробел перед MONTH. В принципе: вы создаете строку с символом 4 MONTH и преобразуете ее с ::type в правильный интервал.

Изменить. Я нашел другое решение: вы можете рассчитать с помощью interval следующим образом:

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

Это выглядит немного приятнее для меня.

Ответ 2

Этот код не имеет ничего общего с вашей ситуацией, но показывает, как использовать переменные в арифметике 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;