$$
е само минимумът за котиране на долари
. Направете го (много!) по-малко вероятно да бъде в конфликт с низове в приложения литерал, като поставите низ между доларите:
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$;
Още съвети
-
Операторът за присвояване в plpgsql е
:=
.=
не е документиран и може да изчезне в бъдещи издания. Още под този свързан въпрос . -
Използвайте
CURRENT_DATE
вместоCURRENT_TIMESTAMP::date
. -
Позволено е, но бих ви посъветвал да не използвате имена на параметри със смесен регистър в plpgsql. Те са нечувствителни към главни и малки букви.
-
Най-важното, опростете :
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$;
Или дори:
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$;
-
Може да се декларира
STABLE
!
- Съществува и тясно свързаната функция
age()
в PostgreSQL прави почти, но не съвсем същото:връща "символичен" резултат със стандартни години и месеци. Следователно израз сage()
може да доведе до различни резултати за по-дълги периоди от време.
Всички те са еквивалентни - с изключение на последните две, които се отклоняват с по-дълги периоди от време:
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;
Що се отнася до първоначалния въпрос:това съобщение за грешка на PostgreSQL не означава непременно, че проблемът е със знака за долар:
В повечето случаи това е липсващ ;
преди този ред. Или може би специални знаци без екраниране в XML, като < > &
? Знакът за долар $
Би трябвало да е добре. Но не съм експерт по мравките. Трябва да има повече контекст в журнала на PostgreSQL.