PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thực thi tệp với SQLExec chứa $$ ký tự

$$ chỉ là mức tối thiểu cho báo giá đô la . Làm cho nó (nhiều!) Ít có khả năng xung đột với các chuỗi trong từ kèm theo bằng cách đặt một chuỗi giữa các đô la:


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

Thêm lời khuyên

  • Toán tử gán trong plpgsql là := . = không có giấy tờ và có thể biến mất trong các bản phát hành trong tương lai. Tìm hiểu thêm về câu hỏi liên quan này .

  • Sử dụng CURRENT_DATE thay vì CURRENT_TIMESTAMP::date .

  • Nó được phép, nhưng tôi khuyên bạn không nên sử dụng tên tham số trường hợp hỗn hợp trong plpgsql. Chúng không phân biệt chữ hoa chữ thường.

  • Quan trọng nhất, hãy đơn giản hóa :

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

    Hoặc thậm chí:

    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$;
    
  • Có thể được khai báo STABLE !

  • Ngoài ra còn có hàm liên quan chặt chẽ age() trong PostgreSQL hầu như làm, nhưng không hoàn toàn giống nhau:nó trả về kết quả "tượng trưng" với năm và tháng tiêu chuẩn. Do đó, biểu thức với age() có thể mang lại các kết quả khác nhau trong khoảng thời gian dài hơn.

Tất cả đều tương đương - ngoại trừ hai điểm cuối cùng lệch với khoảng thời gian dài hơn:

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;

Đối với câu hỏi ban đầu:thông báo lỗi PostgreSQL này không nhất thiết có nghĩa là vấn đề là với ký hiệu đô la:

Hầu hết thời gian, nó là một ; bị thiếu trước dòng đó. Hoặc có thể là một ký tự đặc biệt không có mã thoát trong XML, như < > & ? Ký hiệu đô la $ sẽ ổn thôi. Nhưng tôi không phải là chuyên gia về kiến. Cần có nhiều ngữ cảnh hơn trong nhật ký 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. Thay thế các ký tự unicode trong PostgreSQL

  2. Postgres 9.5 BẬT MÍ DO CHỌN

  3. Không có bộ nhớ đệm kế hoạch thực thi cho SQL động trong PostgreSQL 9.4?

  4. Tổng chênh lệch thời gian giữa các hàng

  5. Lưu đầu ra PL / pgSQL từ PostgreSQL vào tệp CSV