sql >> Base de Datos >  >> RDS >> PostgreSQL

Ejecutar archivo con SQLExec que contiene $$ caracteres

$$ 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 de CURRENT_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 con age() 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.