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
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);
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;