使用psycopg2从PostgreSQL获取长整型值

1 投票
1 回答
701 浏览
提问于 2025-04-15 19:11

我在从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;

撰写回答