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

मैं plpgsql में एक फ़ंक्शन कैसे लिखूं जो समय क्षेत्र के बिना टाइमस्टैम्प के साथ एक तिथि की तुलना करता है?

पावेल ने क्या कहा।

इसके अलावा, कुछ भी नहीं इंगित करता है कि पीएल/पीजीएसक्यूएल के साथ शुरू करने की आवश्यकता है। एक सादा (तैयार) SELECT कथन यह कर सकता है। या एक SQL फ़ंक्शन, यदि आप इसे डेटाबेस में जारी रखना चाहते हैं। देखें:

और संबंधित:

समावेशी / अनन्य ऊपरी / निचली सीमा को परिभाषित करें सटीक रूप से आश्चर्यजनक कॉर्नर केस परिणामों से बचने के लिए। timestamp की तुलना करते समय कॉलम से date . तक , बाद वाले को टाइमस्टैम्प के लिए मजबूर किया जाता है जो दिन के पहले उदाहरण को दर्शाता है:YYYY.MM.DD 00:00:00

आपकी क्वेरी कहती है:

measurement_timestamp <= lastDate AND measurement_timestamp >= firstDate

... जिसमें सभी firstDate . शामिल होंगे , लेकिन सभी lastDate . को छोड़ दें 00:00 बजे पहले (सामान्य) उदाहरण को छोड़कर . आमतौर पर वह नहीं जो आप चाहते हैं। आपके सूत्रीकरण को देखते हुए, मुझे लगता है कि आप वास्तव में यही चाहते हैं:

CREATE OR REPLACE FUNCTION get_measurements_by_node_and_date(node_id integer
                                                           , firstDate date
                                                           , lastDate date) 
  RETURNS TABLE (measurement_id integer
               , node_id integer
               , carbon_dioxide float8
               , hydrocarbons float8
               , temperature float8
               , humidity float8
               , air_pressure float8
               , measurement_timestamp timestamp)
  LANGUAGE sql STABLE AS
$func$
   SELECT m.id
        , m.node_id
        , m.carbon_dioxide
        , m.hydrocarbons
        , m.temperature
        , m.humidity
        , m.air_pressure
        , m.measurement_timestamp -- AS measure  -- just documentation
   FROM   public.measurements_lora m
   WHERE  m.node_id = _node_id
   AND    m.measurement_timestamp >= firstDate::timestamp
   AND    m.measurement_timestamp < (lastDate + 1)::timestamp  -- ①!
$func$;

① इसमें सभी lastDate . शामिल हैं , और कुशलता से। आप बस एक integer date . को / से मान दिनों को जोड़ने/घटाने के लिए . स्पष्ट कास्ट ::timestamp . के लिए वैकल्पिक है क्योंकि तारीख को अभिव्यक्ति में स्वचालित रूप से मजबूर किया जाएगा। लेकिन चूंकि हम यहां भ्रम दूर करने की कोशिश कर रहे हैं...

संबंधित:

एक तरफ 1:

सं. timestamp मान नहीं हैं स्वरूपित, अवधि। वे केवल टाइमस्टैम्प मान हैं (आंतरिक रूप से युग के बाद से माइक्रोसेकंड की संख्या के रूप में संग्रहीत)। प्रदर्शन मान से पूरी तरह से अलग है और मान . को बदले बिना इसे एक सौ एक तरीके से समायोजित किया जा सकता है . क्या हो रहा है इसे बेहतर ढंग से समझने के लिए इस गलत धारणा से छुटकारा पाएं। देखें:

एक तरफ 2:

SQL की कुटिल प्रकृति के बारे में BETWEEN :

एक तरफ 3:

Postgres में कानूनी, लोअर-केस आइडेंटिफ़ायर पर विचार करें। first_date firstDate . के बजाय . देखें:

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज के DISTINCT के बराबर Oracle?

  2. PostgreSQL:एक शर्त के सही होने तक लूप करें

  3. Postgres में त्वरित यादृच्छिक पंक्ति चयन

  4. विंडो फ़ंक्शंस या सामान्य तालिका अभिव्यक्तियाँ:पिछली पंक्तियों को सीमा के भीतर गिनें

  5. sql - श्रेणी के अनुसार समूह बिना मूल्यों के श्रेणियों को शामिल करने के लिए