web-dev-qa-db-fra.com

Comment écrire la valeur bigint (timestamp en millisecondes) comme timestamp dans postgresql

J'essaie de stocker dans le timestamp avec le champ de fuseau horaire ma valeur. C'est en millisecondes à partir de 1970.

select TO_CHAR(TO_TIMESTAMP(1401432881230), 'DD/MM/YYYY HH24:MI:SS.MS')

30/5/2014 11:29:42 10:54:41.230 attendu, mais obtenez 22/08/46379 23:27:02.000

12
Clyde

Les timestamps Unix mesurent le temps en secondes, et not millisecondes (presque partout, même dans PostgreSQL).

Par conséquent, vous devez appeler

SELECT TO_TIMESTAMP(1401432881230 / 1000);

Si vous souhaitez préserver les millisecondes, appelez avec double precision:

SELECT TO_TIMESTAMP(1401432881230::double precision / 1000);
27
pozs

Voici comment convertir MS en horodatage et conserver ms à la place de secondes. La réponse acceptée laissera tomber ms.

WITH ts AS (SELECT 1401432881230 AS ts)
SELECT to_timestamp(ts / 1000) + ((ts % 1000 ) || ' milliseconds') :: INTERVAL
FROM ts;

-- FOR ALTER COLUMN
ALTER TABLE  my_info
  ALTER COLUMN tstmp TYPE TIMESTAMP USING to_timestamp(tstmp / 1000) + ((tstmp % 1000) || ' milliseconds') :: INTERVAL;
0
wener