функция postgres для загрузки годовых данных

#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