PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Esegui il file con SQLExec contenente caratteri $$

$$ è solo il minimo indispensabile per Citazione del dollaro . Rendi (molto!) meno probabile che entri in conflitto con le stringhe nel letterale racchiuso inserendo una stringa tra i dollari:


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$;

Altri consigli

  • L'operatore di assegnazione in plpgsql è := . = non è documentato e potrebbe scomparire nelle versioni future. Ulteriori informazioni in questa domanda correlata .

  • Usa CURRENT_DATE invece di CURRENT_TIMESTAMP::date .

  • È consentito, ma consiglierei di non utilizzare nomi di parametri maiuscoli misti in plpgsql. Non fanno distinzione tra maiuscole e minuscole.

  • Soprattutto, semplificare :

    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 anche:

    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$;
    
  • Può essere dichiarato STABLE !

  • C'è anche la funzione strettamente correlata age() in PostgreSQL fa quasi, ma non del tutto, lo stesso:restituisce un risultato "simbolico" con anni e mesi standard. Pertanto, espressione con age() può produrre risultati diversi per periodi di tempo più lunghi.

Questi sono tutti equivalenti, ad eccezione degli ultimi due che deviano con periodi di tempo più lunghi:

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;

Per quanto riguarda la domanda originale:questo messaggio di errore PostgreSQL non significa necessariamente che il problema sia con il simbolo del dollaro:

La maggior parte delle volte è un ; mancante prima di quella linea. O forse un carattere speciale senza caratteri di escape in XML, come < > & ? Il simbolo del dollaro $ dovrebbe andare bene. Ma non sono un esperto di formica. Ci dovrebbe essere più contesto nel log di PostgreSQL.