1 votes

Utiliser psycopg2 pour obtenir une valeur longue depuis PostgreSQl

Je rencontre un problème lors de la récupération d'une valeur longue dans PostgreSQL.

J'utilise la commande SQL suivante :

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 

Je suis intéressé par l'horodatage unix en ms

J'exécute cette commande manuellement via pgAdmin.

Dans pgAdmin, j'ai vu 1265860762817 for column (extract(epoch FROM start_timestamp) * 1000)

Cependant, lorsque je récupère des données via psycopg2, voici ce que j'utilise :

cur = conn.cursor()
cur.execute(sql)
rows = cur.fetchall()
for row in rows :
    print row[3]

Et voici ce que j'obtiens :

1.26586076282e+12

Je passe cette valeur, de python cgi à JavaScript en JSON

Si je fais une conversion manuelle en JavaScript

1.26586076282e+12

// summary.date is 1.26586076282e+12
var timestamp = summary.date * 1;
// Get 1265860762820
alert(timestamp);

Il y a une différence d'erreur de 3 ms

1265860762817
1265860762820-
==============
            3
==============

Comment éviter une telle erreur ? Comment puis-je m'assurer que psycopg2 me renvoie bien 1265860762817 no 1.26586076282e+12

1voto

Michał Niklas Points 15907

J'obtiens les mêmes résultats en utilisant psycopg2 et pygres. Bien que cette sélection renvoie une valeur flottante, vous pouvez modifier votre code pour formater la valeur renvoyée :

def format_float_fld(v):
    #return str(v)
    return ('%20.0f' % (v)).strip()

Si vous utilisez str(s) vous obtiendrez la notation scientifique.

Vous pouvez également modifier la requête pour qu'elle renvoie bigint au lieu de float :

 SELECT (EXTRACT(EPOCH FROM TIMESTAMP '2010-02-16 20:38:40.123') * 1000)::bigint;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X