2012-10-21 77 views
5

當運行在PSQL以下查詢我回來7個結果:軌道/ PostgreSQL的SQL差異W /日期

SELECT generate_series('2012-10-14', CURRENT_DATE, interval '1 day'); # 7 

然而,當我跑在我的Rails應用程序完全相同的查詢,我得到8個結果:

result = ActiveRecord::Base.connection.execute "SELECT generate_series('2012-10-14', CURRENT_DATE, interval '1 day');" 
puts result.count # 8 

這似乎有什麼要做的時區,但我不知道問題可能是什麼。我在我的application.rb中以下

config.time_zone = 'Eastern Time (US & Canada)' 

這是相同的時區設置,我有我的postgresql.conf

我很困惑於爲什麼我的Rails應用程序添加額外的一天到我的結果。誰能提供一些見解?

這似乎只發生在一天結束後(晚上8點後),所以這是什麼讓我覺得這是什麼w /時區偏移量。

回答

9

您正在使用的版本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"}] 

順便說一句,我討厭時區,討厭和鄙視他們。

+2

+1優秀的解釋。順便說一句,我保留我的*仇恨* DST(夏令時)的朦朧概念,既不節省任何日光也沒有任何意義。通過造成混亂,在全世界浪費了很多時間。 DST應該從存在中移除並且不再提及。 –

+2

@ ErwinBrandstetter:我不能在一個不鼓勵發誓的公共論壇上談論DST,我不能這樣做。 –

+0

感謝您的深入解釋,但它只是讓我討厭時區更多;) –