$$
är bara ett minimum för dollarnotering
. Gör det (mycket!) mindre sannolikt att det kommer i konflikt med strängar i den bifogade bokstaven genom att sätta en sträng mellan dollarn:
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$;
Fler råd
-
Tilldelningsoperatorn i plpgsql är
:=
.=
är odokumenterad och kan försvinna i framtida utgåvor. Mer under denna relaterade fråga . -
Använd
CURRENT_DATE
istället förCURRENT_TIMESTAMP::date
. -
Det är tillåtet, men jag skulle råda dig att inte använda parameternamn med blandade skiftlägen i plpgsql. De är skiftlägesokänsliga.
-
Viktigast av allt, förenkla :
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$;
Eller till och med:
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$;
-
Kan deklareras
STABLE
!
- Det finns också den närbesläktade funktionen
age()
i PostgreSQL gör nästan, men inte riktigt, samma sak:det returnerar ett "symboliskt" resultat med standardår och månader. Därför uttryck medage()
kan ge olika resultat under längre tidsperioder.
Dessa är alla likvärdiga - förutom att de två sista avviker med längre tidsperioder:
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;
När det gäller den ursprungliga frågan:detta PostgreSQL-felmeddelande betyder inte nödvändigtvis att problemet ligger i dollartecknet:
För det mesta är det en saknad ;
före den raden. Eller kanske ett icke-escapet specialtecken i XML, som < > &
? Dollartecknet $
borde bli bra. Men jag är ingen expert på myra. Det borde finnas mer sammanhang i PostgreSQL-loggen.