ruby-on-rails – 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',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将转换为带时区的时间戳,generate_series将生成一组带时区的时间戳;比较这些:
=> 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. 如果手动指定当前日期并明确使用时间戳: 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"}] 顺便说一句,我讨厌时区,讨厌和鄙视他们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- objective-c – 如果手动生成顶点(malloc然后初始化),为什么
- 如何获取C []给定C类的类对象的类对象
- c# – 反应性扩展示例或节流?
- Swift中用CollectionView做广告栏滑动效果
- 将字符串转换为日期时间,格式为yyyy-MM-dd HH:mm:ss in C
- vue-resource请求实现http登录拦截或者路由拦截的方法
- .net – 设置边距,在控件上绑定到ActualWidth的宽度会导致V
- 基于DDD的现代ASP.NET开发框架--ABP系列之14、ABP领域层——
- 泛型 – 如何为嵌套在通用结构体中的类实现一个运算符?
- 在Ruby中乘以两个数组并获得乘积值之和的有效方法是什么?