使用psycopg2从PostgreSQL获取长整型值
我在从PostgreSQL数据库获取长整型值时遇到了问题。
我使用了以下SQL命令:
SELECT *, (extract(epoch FROM start_timestamp) * 1000) FROM lot
WHERE EXTRACT(EPOCH FROM lot.start_timestamp) * 1000 >=1265299200000 AND
EXTRACT(EPOCH FROM lot.start_timestamp) * 1000 <=1265990399999
ORDER BY start_timestamp DESC limit 9 offset 0
我想要的是以毫秒为单位的Unix时间戳。
我通过pgAdmin手动运行这个命令。
在pgAdmin中,我看到1265860762817这个值,来自于列(extract(epoch FROM start_timestamp) * 1000)。
但是,当我通过psycopg2来获取这个值时,我用的是:
cur = conn.cursor()
cur.execute(sql)
rows = cur.fetchall()
for row in rows :
print row[3]
而我得到的结果是:
1.26586076282e+12
我把这个值从Python的CGI传递到JavaScript中,格式是JSON。
如果我在JavaScript中手动转换这个值:
1.26586076282e+12
// summary.date is 1.26586076282e+12
var timestamp = summary.date * 1;
// Get 1265860762820
alert(timestamp);
我发现有3毫秒的误差。
1265860762817
1265860762820-
==============
3
==============
我该如何避免这样的误差?我怎么才能确保psycopg2返回给我的是1265860762817,而不是1.26586076282e+12?
1 个回答
1
我在使用psycopg2和pygres时得到了相同的结果。当这个查询返回浮点数值时,你可以修改你的代码来格式化返回的值:
def format_float_fld(v):
#return str(v)
return ('%20.0f' % (v)).strip()
如果你使用str(s)
,那么你会得到科学计数法的表示方式。
你也可以修改查询,让它返回bigint
而不是float
:
SELECT (EXTRACT(EPOCH FROM TIMESTAMP '2010-02-16 20:38:40.123') * 1000)::bigint;