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