PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेएसक्यूएल तिथि अंतर

डीबग

आपका कार्य जो कर रहा है वह बहुत किया जा सकता है सरल। सिंटैक्स त्रुटि का वास्तविक कारण यहाँ है:

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

वही कॉल।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. किचनपीसी और आयरनपीथन

  2. Postgres मुझे समूह में कॉलम क्यों नहीं दे रहा है?

  3. रेल मॉडल के साथ कई पोस्टग्रेएसक्यूएल स्कीमा का उपयोग करना

  4. मैं एक पोस्टग्रेस संग्रहीत प्रक्रिया कैसे लिखूं जो कुछ भी वापस नहीं करता है?

  5. PgAdmin4 डिबगिंग सक्षम करें