Ruby on rails Rails/Postgresql与日期的差异

Ruby on rails Rails/Postgresql与日期的差异,ruby-on-rails,ruby-on-rails-3,postgresql,date,Ruby On Rails,Ruby On Rails 3,Postgresql,Date,在psql中运行以下查询时,我得到7个结果: 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'

在psql中运行以下查询时,我得到7个结果:

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点之后),所以这让我觉得这是一个带有时区偏移的东西。

您使用的版本是使用时间戳,而不是日期。因此,您的
'2012-10-14'
当前日期
将转换为带时区的
时间戳
s,而
生成序列
将生成一组带时区的
时间戳
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

如果手动指定当前日期并明确使用
时间戳
s:

select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')
然后你会得到相同的七个结果,因为没有时区可以把事情搞得一团糟

忽略时区的最简单方法是使用整数版本的
generate_series
,向日期添加整数会将整数视为天数:

select '2012-10-14'::date + generate_series(0, 6)
这将给你同样的七天没有时区干扰。您仍然可以使用
当前_日期
(由于SQL日期没有时区,因此没有时区),注意两个日期之间的差值是它们之间的天数(整数):

从Rails:

> 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,我就是做不到。谢谢你的深入解释,尽管这让我更讨厌时区;)
> 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"}]