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 timestamp
enviaría una cadena que representaría la marca de tiempo exacta (UTC) para el momento INSERT.
Porque bigint
almacenarí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 bigint
podrí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.
Respuestas:
Almacene las marcas de tiempo como
timestamp
, o más bientimestamptz
(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:
Puede pasar y recuperar una época UNIX de cualquier manera si lo prefiere:
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
INSERT
puede ser tan simple como:Y simplemente no escribas en esa columna. Se rellena automáticamente.
fuente
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
timestamp
es no almacena como una cadena, se almacena como un entero de 8 bytes, exactamente lo mismo quebigint
: documentación de PostgreSQL .fuente