$$
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ớiage()
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.