$$
je jen naprosté minimum pro kotace dolaru
. Snižte (mnohem!) pravděpodobnost konfliktu s řetězci v přiloženém literálu vložením řetězce mezi dolary:
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$;
Další rady
-
Operátor přiřazení v plpgsql je
:=
.=
je nezdokumentovaný a v budoucích verzích může zmizet. Více v této související otázce . -
Použijte
CURRENT_DATE
místoCURRENT_TIMESTAMP::date
. -
Je to povoleno, ale doporučoval bych nepoužívat smíšené názvy parametrů v plpgsql. Nerozlišují malá a velká písmena.
-
A co je nejdůležitější, zjednodušte :
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$;
Nebo dokonce:
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$;
-
Může být prohlášeno za
STABLE
!
- Existuje také úzce související funkce
age()
v PostgreSQL dělá téměř, ale ne úplně totéž:vrací „symbolický“ výsledek se standardními roky a měsíci. Proto výraz pomocíage()
může přinášet různé výsledky po delší dobu.
Všechny jsou ekvivalentní – kromě posledních dvou, které se liší delšími časovými úseky:
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;
Pokud jde o původní otázku:tato chybová zpráva PostgreSQL nemusí nutně znamenat, že problém je se znakem dolaru:
Většinou je to chybějící ;
před tou čárou. Nebo možná speciální znaky bez speciálních znaků v XML, jako je < > &
? Znak dolaru $
mělo by to být v pořádku. Ale nejsem odborník na mravence. V protokolu PostgreSQL by mělo být více kontextu.