Rails从postgresql自动循环毫秒查询

时间:2016-02-26 04:58:54

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

我从exponent value数据库查询Postgresql时出现问题。

当我查询如下:

select t,v from c1.hour where f = 22 and date_trunc('day',t - '1 hour'::INTERVAL) = '2016-02-26 00:00:00' order by t ;


      t          |      v      
---------------------+-------------
 2016-02-26 02:00:00 | 1.45642e+09

返回指数值。

我扩展指数值如下:

select t,to_char(v, '99999999999999999D99') from c1.hour where f = 22 and date_trunc('day',t - '1 hour'::INTERVAL) = '2016-02-26 00:00:00' order by t ;
      t          |      to_char       
---------------------+--------------------
 2016-02-26 02:00:00 | 1456418944

但是当我使用ActiveRecord获取数据时,结果似乎不正确。

#<Aws1:0x00000007940ca8 t: Fri, 26 Feb 2016 02:00:00 JST +09:00, f: 22, v: 1456420000.0>

我的预期结果是: 1456418944而不是1456420000.0

我不明白为什么Rails会返回此结果。我可以帮忙解决这个问题吗?

一些信息:我使用了Rails 4.2.5Ruby 2.2.3gem 'pg', '~> 0.15'

更新:这是小时表

aws1=# \d hour
             Table "c1.hour"
Column |            Type             | Modifiers 
--------+-----------------------------+-----------
t      | timestamp without time zone | not null
f      | smallint                    | not null
h      | smallint                    | not null
v      | real                        | 
q      | smallint                    | 
Indexes:
"hour_key" PRIMARY KEY, btree (t, f, h)

1 个答案:

答案 0 :(得分:1)

我认为这是一个PostgreSQL问题,而不是Rails。 Rails只显示返回的内容。它不会以任何方式调整查询结果。正如我所看到的,当显式查询该字段的PG时,它会返回1.45642e+09,这显然与您在Rails中看到的完全相同(1456420000.0。)

所以,问题是重写为“如何强制PG返回精确值?”嗯,你在OP中回答了这个问题:需要显式类型转换to_char(v, '99999999999999999D99')

总结:我能想到两种解决方案:

  • 在PG中引入新的计算字段,由触发器填充为to_char(v, '99999999999999999D99')
  • 在Rails中使用显式查询。

后者看起来像:

Aws1.connection.execute %Q{
  SELECT t, to_char(v, '99999999999999999D99')
  FROM c1.hour
  WHERE f = 22 
    AND date_trunc('day',t - '1 hour'::INTERVAL) = '2016-02-26 00:00:00'
  ORDER BY t
}