Rails / Postgresql SQL差异w /日期

在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点之后)所以这就是让我认为这是时区偏移的原因。

您正在使用的generate_series版本正在使用时间戳,而不是日期。 因此,您的'2012-10-14'current_date将转换为timestamp with time zone s的timestamp with time zone generate_series将生成一组timestamp with time zone s的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始终会转换为时间戳,并应用数据库会话的时区调整。 Rails会话将以UTC psql与数据库通信,您的psql会话可能正在使用ET。

如果您手动指定当前日期并明确使用timestamp 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) 

这将给你七天没有时区干扰。 您仍然可以使用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) 

从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"}] 

顺便说一句,我讨厌时区,讨厌和鄙视他们。