Использование переменной периода в интервале в 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 неверна. Как это правильно сделано?
Ответы
Ответ 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;