Come archiviare al meglio un timestamp in PostgreSQL?


20

Sto lavorando su un progetto DB PostgreSQL e mi chiedo come archiviare i timestamp nel modo migliore.

ipotesi

Gli utenti con fusi orari diversi useranno il database per tutte le funzioni CRUD.

Ho esaminato 2 opzioni:

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

  • bigint NOT NULL DEFAULT

Per timestampvorrei inviare una stringa che rappresentasse l'esatta data e ora (UTC) per il momento INSERT.

Per bigintavrei memorizzare la stessa cosa, ma in un formato numerico. (i problemi di fuso orario vengono gestiti prima che i millisecondi vengano consegnati al server, quindi sempre i millis in UTC.)

Un vantaggio principale con la memorizzazione di a bigintpotrebbe essere che sarebbe più facile da memorizzare e recuperare, poiché passare un timestamp correttamente formattato è più complesso di un semplice numero (millisecondi da Unix Epoc).

La mia domanda è quale si consentirebbe il design più flessibile e quali potrebbero essere le insidie ​​di ogni approccio.


Ci sono molte ragioni per cui un timestamp è meglio di un bigint per rappresentare i timestamp. Non riesco a pensare a una sola ragione per cui un bigint sarebbe meglio di un timestamp.
Lennart,

Il motivo principale per cui penso che un BigInt possa essere più semplice è che potrebbe essere molto più facile da recuperare e archiviare. Aggiornerò le mie domande.
Bam,

Risposte:


23

Memorizza i timestamp come timestamp, o meglio timestamptz( timestamp with time zone) poiché hai a che fare con più fusi orari . Ciò impone dati validi ed è in genere il più efficiente. Assicurati di comprendere il tipo di dati, ci sono alcune idee sbagliate che galleggiano intorno:

Per rispondere alla tua preoccupazione:

passare un timestamp correttamente formattato è più complesso di un semplice numero

Puoi passare e recuperare un'epoca UNIX in entrambi i modi se preferisci:

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

Relazionato:

Se si desidera memorizzare il timestamp corrente con scritture nel DB, utilizzare una timestamptz colonna con valore predefinitonow() . L'ora di sistema sul server DB è in genere molto più affidabile e coerente rispetto a più client che trasmettono la rispettiva nozione di che ore sono.
Perché INSERTpuò essere semplice come:

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

E non scrivere su quella colonna. Viene compilato automaticamente.


Questo ha chiarito le cose. Oltre al fatto che i timestamp sono memorizzati come numeri interi a 8 byte, lo stesso essenziale della memorizzazione come bigint, la memorizzazione e il recupero con le funzioni "to_timestamp" rende questa scelta molto più semplice. Grazie
Bam,

8

Dovresti sempre archiviare i dati nel suo tipo di dati nativo in modo da poter utilizzare le funzioni integrate. E il tipo di dati di un timestamp è ovviamente a timestamp.

A proposito, a nontimestamp è memorizzato come una stringa, è archiviato come un numero intero a 8 byte, esattamente uguale a : documentazione PostgreSQL .bigint


Mi scuso, intendevo dire che avrei inviato una stringa per l'archiviazione, non per memorizzare un timestamp. Corretto.
Bam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.