Используйте psycopg2 для получения длинного значения из PostgreSQl

1

Я столкнулся с проблемой получения длинного значения из 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 в ms

Я запускаю эту команду вручную через 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. Хотя этот select возвращает значение float, вы можете изменить свой код для форматирования возвращаемого значения:

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню