$$
er kun det absolutte minimum for notering i dollar
. Gør det (meget!) mindre tilbøjelige til at komme i konflikt med strenge i den vedlagte bogstav ved at sætte en streng mellem dollars:
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$;
Flere råd
-
Tildelingsoperatoren i plpgsql er
:=
.=
er udokumenteret og kan forsvinde i fremtidige udgivelser. Mere under dette relaterede spørgsmål . -
Brug
CURRENT_DATE
i stedet forCURRENT_TIMESTAMP::date
. -
Det er tilladt, men jeg vil fraråde at bruge parameternavne med blandede store og små bogstaver i plpgsql. Der skelnes mellem store og små bogstaver.
-
Vigtigst af alt, forenkle :
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 endda:
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 erklæres
STABLE
!
- Der er også den nært beslægtede funktion
age()
i PostgreSQL gør næsten, men ikke helt, det samme:det returnerer et "symbolsk" resultat med standardår og måneder. Derfor udtryk medage()
kan give forskellige resultater i længere perioder.
Disse er alle ækvivalente - bortset fra at de sidste to afviger med længere 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;
Med hensyn til det oprindelige spørgsmål:denne PostgreSQL-fejlmeddelelse betyder ikke nødvendigvis, at problemet er med dollartegnet:
Det meste af tiden er det en manglende ;
før den linje. Eller måske et ikke-escaped specialtegn i XML, såsom < > &
? Dollartegnet $
burde være fint. Men jeg er ingen ekspert i myre. Der burde være mere kontekst i PostgreSQL-loggen.