#postgresql
Вопрос:
У меня есть 2 функции: 1-я-для данных за месяц, которая принимает параметр даты (последняя дата любого месяца), это усечение и загрузка. 2-й предназначен для годовых данных, которые используют вышеуказанную функцию для добавления данных в годовую таблицу. Параметр-это количество месяцев (например, если параметр равен 12, он должен указывать последние 12 месяцев, если его 6, он должен указывать последние 6 месяцев) Для нашего примера его 12.
функция 1 вызывается следующим образом:
select * from fn_monthly('2021-08-31')
Для 2-й функции нам в основном нужно выполнить итерацию на основе параметра months и выполнить функцию.
Его определяют следующим образом:
CREATE OR REPLACE FUNCTION fn_yearly(in months int)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
v_months int = (months*-1) 2;
v_date date;
begin -- executes all code including exception logic
begin -- returns success if no exception
truncate table yearly_table;
for counter in reverse 1..v_months loop
v_date := (Date_trunc('month', CURRENT_DATE) interval '% month - 1 day',counter)::date;
-- this should put last date of month in variable v_date
-- example when counter is 1, then v_date = '2021-08-31'
-- example when counter is 0, then v_date = '2021-07-31'
-- example when counter is -1, then v_date = '2021-06-30'
--this is the date I needs to pass into the monthly function
select * from fn_monthly(v_date);
insert into yearly_table(col1,col2) select col1,col2 from monthly_table;
end loop;
end; -- returns success if no exception
$function$
;
когда я выполняю вышеуказанную функцию, я получаю следующую ошибку:
ErrorCode:42846, ErrorMsg:cannot cast type record to date
Каков наилучший способ решения этой проблемы? Может быть, какой-то другой подход.
Ответ №1:
Ошибка связана с этим выражением:
(Date_trunc('month', CURRENT_DATE) interval '% month - 1 day',counter)::date
Вы хотели отформатировать интервал с '% month - 1 day',counter
помощью, но синтаксис в этом контексте неприемлем, используйте:
(Date_trunc('month', CURRENT_DATE) interval '1 month'* counter - interval '1 day')::date