¿Cómo almacenar mejor una marca de tiempo en PostgreSQL?


20

Estoy trabajando en un diseño de base de datos PostgreSQL y me pregunto cómo almacenar mejor las marcas de tiempo.

Supuestos

Los usuarios en diferentes zonas horarias utilizarán la base de datos para todas las funciones CRUD.

He visto 2 opciones:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

Porque timestampenviaría una cadena que representaría la marca de tiempo exacta (UTC) para el momento INSERT.

Porque bigintalmacenaría exactamente lo mismo, pero en un formato numérico. (los problemas de zona horaria se manejan antes de que millis se entregue al servidor, por lo que siempre millis en UTC).

Una ventaja principal con el almacenamiento de a bigintpodría ser que sería más fácil de almacenar y recuperar, ya que pasar una marca de tiempo con el formato correcto es más complejo que un número simple (millis desde Unix Epoc).

Mi pregunta es cuál permitiría el diseño más flexible y cuáles podrían ser los escollos de cada enfoque.


Hay muchas razones por las que una marca de tiempo es mejor que una letra grande para representar marcas de tiempo. No puedo pensar en una sola razón por la cual un bigint sería mejor que una marca de tiempo.
Lennart

La razón principal por la que puedo pensar que un BigInt puede ser más fácil es que podría ser mucho más fácil de recuperar y almacenar. Actualizaré mis preguntas.
Bam

Respuestas:


23

Almacene las marcas de tiempo como timestamp, o más bien timestamptz( timestamp with time zone) ya que se trata de varias zonas horarias . Eso impone datos válidos y generalmente es más eficiente. Asegúrese de comprender el tipo de datos, hay algunas ideas falsas que flotan:

Para abordar su inquietud:

pasar una marca de tiempo correctamente formateada es más complejo que un número simple

Puede pasar y recuperar una época UNIX de cualquier manera si lo prefiere:

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

Relacionado:

Si desea almacenar la marca de tiempo actual con escrituras en la base de datos, use una timestamptz columna con el valor predeterminadonow() . El tiempo del sistema en el servidor de base de datos es, por lo general, mucho más confiable y consistente que el de varios clientes que transmiten su respectiva noción de qué hora es.
Porque INSERTpuede ser tan simple como:

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

Y simplemente no escribas en esa columna. Se rellena automáticamente.


Esto dejó las cosas claras. Además del hecho de que las marcas de tiempo se almacenan como enteros de 8 bytes, lo mismo que el almacenamiento como bigint, almacenar y recuperar con las funciones "to_timestamp" hace que esta sea una opción mucho más simple. Gracias
Bam

8

Siempre debe almacenar datos en su tipo de datos nativo para que pueda usar las funciones integradas. Y el tipo de datos de una marca de tiempo es obviamente un timestamp.

Por cierto, una timestampes no almacena como una cadena, se almacena como un entero de 8 bytes, exactamente lo mismo que bigint: documentación de PostgreSQL .


Mis disculpas, quise decir que enviaría una cadena para el almacenamiento, no para almacenar una marca de tiempo. Lo corrigió
Bam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.