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

रेल/पोस्टग्रेस्क्ल एसक्यूएल मतभेद डब्ल्यू/तिथियां

generate_series . का संस्करण जिसका आप उपयोग कर रहे हैं वह टाइमस्टैम्प के साथ काम कर रहा है, तारीखों के साथ नहीं। तो आपका '2012-10-14' और current_date timestamp with time zone में परिवर्तित हो रहे हैं s और generate_series timestamp with time zone . का एक सेट तैयार कर रहा है एस; इनकी तुलना करें:

=> select generate_series('2012-10-14', current_date, '1 day');
    generate_series     
------------------------
 2012-10-14 00:00:00-07
 2012-10-15 00:00:00-07
 2012-10-16 00:00:00-07
 2012-10-17 00:00:00-07
 2012-10-18 00:00:00-07
 2012-10-19 00:00:00-07
 2012-10-20 00:00:00-07
(7 rows)

=> select generate_series('2012-10-14', current_date::timestamp, '1 day');
   generate_series   
---------------------
 2012-10-14 00:00:00
 2012-10-15 00:00:00
 2012-10-16 00:00:00
 2012-10-17 00:00:00
 2012-10-18 00:00:00
 2012-10-19 00:00:00
 2012-10-20 00:00:00
(7 rows)

पहले वाले में समय क्षेत्र होते हैं, दूसरे में नहीं।

लेकिन, current_date डेटाबेस सत्र के समय क्षेत्र समायोजन लागू होने के साथ हमेशा टाइमस्टैम्प में परिवर्तित हो जाता है। रेल सत्र यूटीसी में डेटाबेस से बात करेगा, आपका psql सत्र शायद ET का उपयोग कर रहा है।

यदि आप मैन्युअल रूप से वर्तमान तिथि निर्दिष्ट करते हैं और स्पष्ट रूप से timestamp . के साथ काम करते हैं एस:

select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')

तो आपको दोनों में समान सात परिणाम मिलेंगे क्योंकि चीजों को गड़बड़ाने के लिए कोई समय क्षेत्र नहीं है।

समय क्षेत्रों को अनदेखा करने का सबसे आसान तरीका generate_series . के पूर्णांक संस्करण का उपयोग करना है और तथ्य यह है कि किसी तिथि में एक पूर्णांक जोड़ना पूर्णांक को कई दिनों के रूप में मानता है:

select '2012-10-14'::date + generate_series(0, 6)

यह आपको समय क्षेत्र के हस्तक्षेप के बिना वही सात दिन देगा। आप अभी भी current_date . का उपयोग कर सकते हैं (जिसका कोई समय क्षेत्र नहीं है क्योंकि SQL तिथियों में समय क्षेत्र नहीं है) यह ध्यान में रखते हुए कि दो तिथियों के बीच का अंतर उनके बीच के दिनों की संख्या है (एक पूर्णांक):

=> select '2012-10-14'::date + generate_series(0, current_date - '2012-10-14');
  ?column?  
------------
 2012-10-14
 2012-10-15
 2012-10-16
 2012-10-17
 2012-10-18
 2012-10-19
 2012-10-20
(7 rows)

और रेल से:

> pp ActiveRecord::Base.connection.execute("select '2012-10-14'::date + generate_series(0, 6)").to_a
[{"?column?"=>"2012-10-14"},
 {"?column?"=>"2012-10-15"},
 {"?column?"=>"2012-10-16"},
 {"?column?"=>"2012-10-17"},
 {"?column?"=>"2012-10-18"},
 {"?column?"=>"2012-10-19"},
 {"?column?"=>"2012-10-20"}]

BTW, मैं समय क्षेत्रों से घृणा करता हूँ, उनसे घृणा करता हूँ और उनसे घृणा करता हूँ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL दिनांक () समय क्षेत्र के साथ

  2. PostgreSQL के प्रदर्शन को बेंचमार्क कैसे करें

  3. स्प्रिंग डेटा जेपीए ऑडिटिंग @Modifying एनोटेशन के साथ जेपीए रिपोजिटरी अपडेट विधि के लिए काम नहीं कर रहा है, क्यों?

  4. पीजी ::अपरिभाषित तालिका:त्रुटि:सही रेल नामकरण और सम्मेलन के साथ संबंध मौजूद नहीं है

  5. postgresql:INSERT INTO ... (चुनें * ...)