我从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.5
,Ruby 2.2.3
和gem '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)
答案 0 :(得分:1)
我认为这是一个PostgreSQL问题,而不是Rails。 Rails只显示返回的内容。它不会以任何方式调整查询结果。正如我所看到的,当显式查询该字段的PG时,它会返回1.45642e+09
,这显然与您在Rails中看到的完全相同(1456420000.0
。)
所以,问题是重写为“如何强制PG返回精确值?”嗯,你在OP中回答了这个问题:需要显式类型转换to_char(v, '99999999999999999D99')
。
总结:我能想到两种解决方案:
to_char(v, '99999999999999999D99')
或后者看起来像:
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
}