【问题标题】:Rails auto round millisecond query from postgresql来自 postgresql 的 Rails 自动轮毫秒查询
【发布时间】:2016-02-26 04:58:54
【问题描述】:

当我从Postgresql 数据库查询exponent value 时遇到问题。

当我查询如下:

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', '~&gt; 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)

【问题讨论】:

  • 感谢您的回复。是的,Aws1 是表 c1.hour 的模型。我的第一个查询与此值相同。但我想获得真正的价值作为第二个查询。
  • 是的,我只输入Aws1.where(f: 22).order(t: :desc).first,它会返回上面的记录。
  • v是什么类型?你能告诉我们\d c1.hour的输出吗?
  • 抱歉,我更新了我的餐桌时间。请刷新您的浏览器。谢谢。

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


【解决方案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
}

【讨论】:

  • 感谢您的回复。我完全同意你的回答,但我用的是Aws1.find_by_sql("...")
  • 是的,Aws1.find_by_sql("...") 更好。
猜你喜欢
  • 2019-04-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2019-12-04
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多