$$
es solo el mínimo indispensable para cotización de dólares
. Haga que sea (¡mucho!) menos probable que entre en conflicto con las cadenas en el literal adjunto al colocar una cadena entre los dólares:
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$;
Más consejos
-
El operador de asignación en plpgsql es
:=
.=
no está documentado y puede desaparecer en versiones futuras. Más en esta pregunta relacionada . -
Use
CURRENT_DATE
en lugar deCURRENT_TIMESTAMP::date
. -
Está permitido, pero recomendaría no usar nombres de parámetros en mayúsculas y minúsculas en plpgsql. No distinguen entre mayúsculas y minúsculas.
-
Lo más importante es simplificar :
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 incluso:
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$;
-
Se puede declarar
STABLE
!
- También existe la función estrechamente relacionada
age()
en PostgreSQL haciendo casi lo mismo, pero no del todo:devuelve un resultado "simbólico" con años y meses estándar. Por lo tanto, expresión conage()
puede producir resultados diferentes durante períodos de tiempo más prolongados.
Todos estos son equivalentes, excepto los dos últimos que se desvían con períodos de tiempo más largos:
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;
En cuanto a la pregunta original:este mensaje de error de PostgreSQL no significa necesariamente que el problema esté relacionado con el signo de dólar:
La mayoría de las veces es un ;
faltante antes de esa línea. O tal vez caracteres especiales sin escape en XML, como < > &
? El signo de dólar $
debería estar bien. Pero no soy un experto en hormigas. Debería haber más contexto en el registro de PostgreSQL.