您正在使用的版本generate_series
正在使用時間戳,而不是日期。因此您的'2012-10-14'
和current_date
正在轉換爲timestamp with time zone
s和generate_series
正在生成一組timestamp with time zone
s;比較這些:
=> 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
總是被轉換爲時間戳,並應用了數據庫會話的時區調整。 Rails會話將以UTC協議與數據庫交談,您的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"}]
順便說一句,我討厭時區,討厭和鄙視他們。
+1優秀的解釋。順便說一句,我保留我的*仇恨* DST(夏令時)的朦朧概念,既不節省任何日光也沒有任何意義。通過造成混亂,在全世界浪費了很多時間。 DST應該從存在中移除並且不再提及。 –
@ ErwinBrandstetter:我不能在一個不鼓勵發誓的公共論壇上談論DST,我不能這樣做。 –
感謝您的深入解釋,但它只是讓我討厭時區更多;) –