$$
è solo il minimo indispensabile per Citazione del dollaro
. Rendi (molto!) meno probabile che entri in conflitto con le stringhe nel letterale racchiuso inserendo una stringa tra i dollari:
CREATE OR REPLACE FUNCTION time_to_sec(timepoint timestamp with time zone)
RETURNS bigint LANGUAGE plpgsql AS
$BODY$
DECLARE
seconds bigint;
secondsFromEpoch bigint;
secondsFromMidnight bigint;
BEGIN
secondsFromEpoch = EXTRACT(EPOCH FROM timepoint)::bigint;
secondsFromMidnight = EXTRACT(EPOCH FROM CURRENT_TIMESTAMP::date)::bigint;
seconds = secondsFromEpoch - secondsFromMidnight;
return seconds;
END;
$BODY$;
Altri consigli
-
L'operatore di assegnazione in plpgsql è
:=
.=
non è documentato e potrebbe scomparire nelle versioni future. Ulteriori informazioni in questa domanda correlata . -
Usa
CURRENT_DATE
invece diCURRENT_TIMESTAMP::date
. -
È consentito, ma consiglierei di non utilizzare nomi di parametri maiuscoli misti in plpgsql. Non fanno distinzione tra maiuscole e minuscole.
-
Soprattutto, semplificare :
CREATE OR REPLACE FUNCTION time_to_sec2(timepoint timestamp with time zone) RETURNS bigint LANGUAGE plpgsql STABLE AS $BODY$ BEGIN RETURN EXTRACT(EPOCH FROM timepoint - current_date)::bigint; END; $BODY$;
O anche:
CREATE OR REPLACE FUNCTION time_to_sec3(timepoint timestamp with time zone) RETURNS bigint LANGUAGE sql AS $BODY$ SELECT EXTRACT(EPOCH FROM timepoint - current_date)::bigint; $BODY$;
-
Può essere dichiarato
STABLE
!
- C'è anche la funzione strettamente correlata
age()
in PostgreSQL fa quasi, ma non del tutto, lo stesso:restituisce un risultato "simbolico" con anni e mesi standard. Pertanto, espressione conage()
può produrre risultati diversi per periodi di tempo più lunghi.
Questi sono tutti equivalenti, ad eccezione degli ultimi due che deviano con periodi di tempo più lunghi:
WITH x(t) AS (VALUES ('2012-07-20 03:51:26+02'::timestamptz))
SELECT time_to_sec(t) AS t1
,time_to_sec2(t) AS t2
,time_to_sec3(t) AS t3
,EXTRACT(EPOCH FROM t - current_date)::bigint AS t4
,EXTRACT(EPOCH FROM age(t, current_date))::bigint AS t5 -- deviates
,EXTRACT(EPOCH FROM age(t))::bigint * -1 AS t6 -- deviates
FROM x;
Per quanto riguarda la domanda originale:questo messaggio di errore PostgreSQL non significa necessariamente che il problema sia con il simbolo del dollaro:
La maggior parte delle volte è un ;
mancante prima di quella linea. O forse un carattere speciale senza caratteri di escape in XML, come < > &
? Il simbolo del dollaro $
dovrebbe andare bene. Ma non sono un esperto di formica. Ci dovrebbe essere più contesto nel log di PostgreSQL.