在“pubblicazione”表中,我想插入包含在“legge_approvata”表中的元组的一些字段,但要做到这一点,颁布日期必须与法律颁布日期在同年同月。如果满足此条件,则函数更新其他属性并插入元组的其他字段,即更新已批准法律的计数器,再添加一个并同意在 NEW 中插入属性的所有其他值。
我希望我现在更清楚了。
我试图通过首先在 if 中进行选择来隔离错误,但我发现您无法将日期转换为字符串,那么您是怎么做的呢?我如何将它转换成一个字符?但那将需要另一个周期。
我想从日期类型的属性中提取月份和年份到 law_approvata.data_promulgazione
SELECT EXTRACT(MONTH FROM TIMESTAMP legge_approvata.data_promulgazione);
SELECT EXTRACT(YEAR FROM TIMESTAMP legge_approvata.data_promulgazione);
ERRORE: errore di sintassi a o presso "legge_approvata"
LINE 5: SELECT EXTRACT(MONTH FROM TIMESTAMP legge_approvata.data_pr...
^
********** Error **********
ERRORE: errore di sintassi a o presso "legge_approvata"
SQL state: 42601}
询问:
INSERT INTO public.pubblicazione(
titolo_legge,
legislatura,
gazzetta_numero,
data_pubblicazione,
leggi_legislatura,
tot_num_leggi,
testo,
relatore,
numero_legge)
VALUES (
'[Legge di bilancio 2018] Bilancio di previsione dello Stato per l anno finanziario 2018 e bilancio pluriennale per il triennio 2018-2020',
17,
'302' ,--gazzetta_numero
'29/12/2017' , -- data_pubblicazione
0,--leggi_legislatura int
0,
'https://parlamento17.openpolis.it/atto/documento/id/523404' ,
'{"Marcello Gualdani","Magda Angela Zanoni","Pier Carlo Padoan"}' ,
'S.2960-B');
触发前:
CREATE TRIGGER inserimento
BEFORE INSERT
ON public.pubblicazione
FOR EACH ROW
EXECUTE PROCEDURE public.inserimento_pubblicazione();
触发功能
begin
if exists (select 1 from legge_approvata
where NEW.titolo_legge = legge_approvata.titolo and
new.data_pubblicazione between
(SELECT EXTRACT(MONTH FROM /*TIMESTAMP*/ legge_approvata.data_promulgazione))and
(SELECT EXTRACT(YEAR FROM /*TIMESTAMP */ legge_approvata.data_promulgazione))
)
then
new.leggi_legislatura= (select count(*) from legge_approvata where NEW.titolo_legge = legge_approvata.titolo and
data_promulgazione between
(SELECT EXTRACT(MONTH FROM /*TIMESTAMP*/ legge_approvata.data_promulgazione))and
(SELECT EXTRACT(YEAR FROM /*TIMESTAMP*/ legge_approvata.data_promulgazione)) and
legge_approvata.legislatura=new.legislatura )
+1;
new.tot_num_leggi=(select count(*) from legge_approvata);
return new;
else
raise exception '% non è stata promulgata nello stesso mese e anno %',new.titolo_legge, legge_approvata.data_promulgazione;
end if;
end;}
输出错误:
ERRORE: l'operatore non esiste: date >= double precision
LINE 3: new.data_pubblicazione between
^
HINT: Nessun operatore trovato con nome e tipi di argomenti forniti. Potrebbe essere necessario convertire i tipi esplicitamente.
QUERY: SELECT exists (select 1 from legge_approvata
where NEW.titolo_legge = legge_approvata.titolo and
new.data_pubblicazione between
(SELECT EXTRACT(MONTH FROM /*TIMESTAMP*/ legge_approvata.data_promulgazione))and
(SELECT EXTRACT(YEAR FROM /*TIMESTAMP */ legge_approvata.data_promulgazione))
)
CONTEXT: funzione PL/pgSQL inserimento_pubblicazione() riga 5 a IF
********** Error **********
ERRORE: l'operatore non esiste: date >= double precision
SQL state: 42883
Hint: Nessun operatore trovato con nome e tipi di argomenti forniti. Potrebbe essere necessario convertire i tipi esplicitamente.
Context: funzione PL/pgSQL inserimento_pubblicazione() riga 5 a IF
谢谢你。
例子:
SELECT EXTRACT(MONTH FROM TIMESTAMP '25/03/1982');
SELECT EXTRACT(YEAR FROM TIMESTAMP '2018-02-16');
提取年份
提取月份
你把事情复杂化了。
其一,您不必
SELECT
在每个函数调用前都进行编写。select extract(...)
可以简单地替换为extract(...)
但是您似乎混淆了函数的作用。
与
data_pubblicazione
日期值一样,这个(简化的)条件归结为:
显然这没有任何意义。比较的比较双方需要是同一类型。
您只想检查两个日期是否在同一个月。您可以使用 use
date_trunc()
或to_char()
将两个日期“规范化”为月初:或使用
to_char()
理论上你可以使用 extract,但在我看来,这会使条件变得极其不可读
上述情况导致类似:
where (2019,3) = (2019,3)
所以
if
声明应该是这样的:任务也需要调整。我个人更喜欢
select ... into variable from ...
在 PL/pgSQL 中使用,但这是风格问题: