2012-08-03 6 views

risposta

2

intero sarebbe buono, ma non abbastanza, perché PostgreSQL non supporta i tipi senza segno

+0

Penso di poterlo contrastare con un assegno per farlo comportare come un numero senza segno. – ThinkingMonkey

+1

fino al 2038 questo non è un problema :) – CyberDem0n

+0

probabilmente userò bigint allora. Ma non sarebbe bello conservare i bit in più. – ThinkingMonkey

19

avevo appena andare con l'utilizzo di TIMESTAMP CON (OUT) fuso orario e uso ESTRATTO per ottenere una rappresentazione timestamp UNIX quando serve .

Confronta

SELECT NOW(); 

con

SELECT EXTRACT(EPOCH FROM NOW()); 
+0

Come sto dicendo, voglio memorizzare i timestamp Unix. Il datatype timestamp memorizza letterale 'unix timestamp'? – ThinkingMonkey

+0

'TIMESTAMP WITH (OUT) TIME ZONE' non memorizza i timestamp letterali. – ThinkingMonkey

+0

Davvero non penso che sia stato richiesto il downvote. Postgres non ha un tipo di dati che mappa letteralmente in unix timestamp. Devi utilizzare la timestamp di Postgres o un tipo non temporale. Se lo fai, non sarai in grado di usare SQL per confrontare i timestamp – GordonM

4

non capisco il motivo per cui la questione ha alcuni voti negativi.

In ogni caso, ho trovato un closely related question nel sito Database Administrators (con molti voti positivi).

Questo è solo per suggerire di dare un'occhiata lì, poiché ci sono informazioni molto più complete su questo argomento non banale.

+0

Grazie per il link. e per aver detto che questo è un argomento non banale. +1. – ThinkingMonkey

36

Il timestamp unix epoch in questo momento (2014-04-09) è 1397071518. Quindi abbiamo bisogno di un tipo di dati in grado di memorizzare un numero almeno così grande.

Quali tipi di dati sono disponibili?

Se si fa riferimento alla PostgreSQL documentation on numeric types troverete le seguenti opzioni:

Name  Size  Minimum    Maximum 
smallint 2 bytes -32768    +32767 
integer 4 bytes -2147483648   +2147483647 
bigint 8 bytes -9223372036854775808 +9223372036854775807 

Che cosa significa questo in termini di rappresentanza tempo?

Ora, possiamo prendere questi numeri e li converte in date utilizzando un epoch converter:

Name  Size  Minimum Date  Maximum Date 
smallint 2 bytes 1969-12-31  1970-01-01 
integer 4 bytes 1901-12-13  2038-01-18 
bigint 8 bytes -292275055-05-16 292278994-08-17 

Si noti che in ultima istanza, si utilizza secondi mette così lontano nel passato e il futuro che probabilmente non importa. Il risultato che ho dato è se rappresenti l'epoca unix in millisecondi.

Quindi, cosa abbiamo imparato?

  1. smallint è chiaramente una cattiva scelta.
  2. integer è una scelta decente per il momento, ma il tuo software esploderà nell'anno 2038. L'apocalisse Y2K non ha nulla sul Year 2038 Problem.
  3. Utilizzare bigint è la scelta migliore. Questo è a prova di futuro contro i bisogni umani più concepibili, anche se the Doctor può ancora criticise esso.

Si può o non si può considerare se potrebbe non essere il migliore per memorizzare il timestamp in un altro formato come lo standard ISO 8601.

+0

risposta molto buona e molto ben ilustrato il pro e contro di ogni tipo di dati – Freaktor