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, मैं समय क्षेत्रों से घृणा करता हूँ, उनसे घृणा करता हूँ और उनसे घृणा करता हूँ।