Используйте psycopg2 для получения длинного значения из PostgreSQl - PullRequest
1 голос
/ 12 февраля 2010

У меня проблема с получением длинного значения из 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 для столбца (извлечение (эпоха ОТ 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 голос
/ 12 февраля 2010

У меня одинаковые результаты при использовании 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...