डीबग
आपका कार्य जो कर रहा है वह बहुत किया जा सकता है सरल। सिंटैक्स त्रुटि का वास्तविक कारण यहाँ है:
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
ऐसा लगता है कि आप startDate
cast कास्ट करने का प्रयास कर रहे हैं करने के लिए timestamp
, जो शुरू करने के लिए बकवास है, क्योंकि आपका पैरामीटर startDate
timestamp
. के रूप में घोषित किया गया है पहले से ही।
यह भी काम नहीं करता है। मैं मैनुअल को यहां उद्धृत करता हूं :
यह करेगा इस तरह काम करें:
SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;
लेकिन यह अभी भी बहुत मायने नहीं रखेगा। आप "तारीखों" के बारे में बात कर रहे हैं, लेकिन फिर भी अपने पैरामीटर को timestamp
. के रूप में परिभाषित करें . आप कर सकते थे आपके पास जो कुछ इस तरह है उसे साफ करें:
CREATE OR REPLACE FUNCTION f_date_diff()
RETURNS int AS
$BODY$
DECLARE
start_date date;
end_date date;
date_diff int;
BEGIN
SELECT evt_start_date FROM events WHERE evt_id = 5 INTO start_date;
SELECT evt_start_date FROM events WHERE evt_id = 6 INTO end_date;
date_diff := (endDate - startDate);
RETURN date_diff;
END
$BODY$ LANGUAGE plpgsql;
DECLARE
केवल एक बार चाहिए।date
कॉलम को उचित प्रकार के रूप में घोषित किया गयाdate
।- मिश्रित केस पहचानकर्ताओं का उपयोग न करें, जब तक कि आप ठीक से नहीं जानते कि आप क्या कर रहे हैं।
- प्रारंभ को घटाएं अंत . से सकारात्मक संख्या प्राप्त करने के लिए या एब्सोल्यूट वैल्यू ऑपरेटर
@
। -
तिथियां . घटाने के बाद से (टाइमस्टैम्प घटाने के विपरीत , जो एक
interval
उत्पन्न करता है ) पहले से हीinteger
उत्पन्न करता है , इसे सरल करें:SELECT (startDate - endDate) INTO diffDatePart;
या plpgsql असाइनमेंट के रूप में और भी सरल:
diffDatePart := (startDate - endDate);
साधारण क्वेरी
आप एक साधारण प्रश्न के साथ सरल कार्य को हल कर सकते हैं - एक सबक्वेरी का उपयोग करके:
SELECT (SELECT evt_start_date
FROM events
WHERE evt_id = 6)
- evt_start_date AS date_diff
FROM events
WHERE evt_id = 5;
या आप CROSS JOIN
कर सकते हैं आधार तालिका स्वयं के लिए (प्रत्येक उदाहरण से 1 पंक्ति, तो यह ठीक है):
SELECT e.evt_start_date - s.evt_start_date AS date_diff
FROM events e
,events s
WHERE e.evt_id = 6
AND s.evt_id = 5;
एसक्यूएल फ़ंक्शन
यदि आप इस उद्देश्य के लिए किसी फ़ंक्शन पर जोर देते हैं, तो एक साधारण sql फ़ंक्शन का उपयोग करें:
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE sql AS
$func$
SELECT e.evt_start_date - s.evt_start_date
FROM events s, events e
WHERE s.evt_id = $1
AND e.evt_id = $2
$func$;
कॉल करें:
SELECT f_date_diff(5, 6);
PL/pgSQL फ़ंक्शन
अगर आप plpgsql पर जोर देते हैं ...
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE plpgsql AS
$func$
BEGIN
RETURN (SELECT evt_start_date
- (SELECT evt_start_date FROM events WHERE evt_id = _start_id)
FROM events WHERE evt_id = _end_id);
END
$func$;
वही कॉल।