$$
डॉलर-उद्धरण
. डॉलर के बीच एक स्ट्रिंग डालकर इसे (बहुत!) कम स्ट्रिंग के साथ संघर्ष करने की संभावना कम करें:
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 लॉग में अधिक संदर्भ होना चाहिए।