PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изпълнете файл с SQLExec, съдържащ $$ знаци

$$ е само минимумът за котиране на долари . Направете го (много!) по-малко вероятно да бъде в конфликт с низове в приложения литерал, като поставите низ между доларите:


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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres sql, как да се увеличи, когато съществува null

  2. Postgresql - откриване на промени и извикване на уеб услуга

  3. Какъв е максималният размер на пакета JDBC?

  4. Експортирайте конкретни редове от PostgreSQL таблица като INSERT SQL скрипт

  5. Как да чета данни от PostgreSQL wal файл? Има ли някаква команда за преобразуване на PostgreSQL двоичен формат в четим текстов формат?