$$
ドルの見積もり
。ドルの間に文字列を置くことで、囲まれたリテラル内の文字列と競合する可能性を(はるかに!)少なくします:
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$;
- 密接に関連する関数
age()
PostgreSQLでは、ほぼ同じですが、まったく同じではありません。標準の年と月で「シンボリック」な結果を返します。したがって、age()
を使用した式 長期間にわたって異なる結果をもたらす可能性があります。
これらはすべて同等です-最後の2つがより長い期間で逸脱していることを除いて:
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ログにはより多くのコンテキストがあるはずです。