2012-08-03 8 views

Antwort

2

integer wäre gut, aber nicht gut genug, weil postgresql nicht signierte Typen unterstützt die

+0

Ich denke, ich kann das mit einem Check kontern, damit es sich wie eine vorzeichenlose Nummer verhält. – ThinkingMonkey

+1

bis 2038 ist das kein problem :) – CyberDem0n

+0

wahrscheinlich bigint dann verwenden. Aber es wäre nicht gut, die zusätzlichen Bits zu speichern. – ThinkingMonkey

19

Ich würde nur gehen mit der Verwendung von TIMESTAMP WITH (OUT) ZEITZONE und verwende EXTRACT eine UNIX-Zeitstempel-Darstellung zu erhalten, wenn man einen braucht .

Vergleichen

SELECT NOW(); 

mit

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

Wie ich sage, möchte ich Unix-Zeitstempel speichern. Enthält der timestamp-Datentyp den literalen 'unix timestamp'? – ThinkingMonkey

+0

'TIMESTAMP WITH (OUT) TIME ZONE' speichert keine wörtlichen Zeitstempel. – ThinkingMonkey

+0

Ich glaube wirklich nicht, dass der Downvote aufgerufen wurde. Postgres hat keinen Datentyp, der dem Unix-Zeitstempel entspricht. Sie müssen entweder postgres timestamp oder einen nicht-temporalen Typ verwenden. Wenn Sie das letztere tun, werden Sie nicht in der Lage sein, SQL zu verwenden, um Zeitstempel – GordonM

4

Ich verstehe nicht, warum die Frage hat einige negative Stimmen.

Wie auch immer, ich habe eine closely related question in der Datenbank-Administratoren Website (mit vielen positiven Stimmen) gefunden.

Dies ist nur zu empfehlen, einen Blick dorthin zu werfen, da es eine viel umfassendere Information über dieses nicht-triviale Thema gibt.

+0

Danke für den Link. und zu erwähnen, dass dies ein nicht-triviales Thema ist. +1. – ThinkingMonkey

36

Der Unix Epoche Zeitstempel ist jetzt (2014-04-09) ist 1397071518. Wir brauchen also einen Datentyp, der in der Lage ist, eine Nummer mindestens so groß zu speichern.

Welche Datentypen sind verfügbar?

Wenn Sie die PostgreSQL documentation on numeric types finden Sie folgende Optionen finden:

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

Was das in Bezug auf die Zeitdarstellung bedeutet?

Jetzt können wir diese Zahlen nehmen und sie in Daten umwandeln mit einem 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 

Beachten Sie, dass in letzter Instanz Sekunden mit Ihnen so weit in die Vergangenheit versetzt und die Zukunft, dass es wahrscheinlich ist egal. Das Ergebnis, das ich angegeben habe, ist, wenn Sie die Unix-Epoche in Millisekunden darstellen.

Also, was haben wir gelernt?

  1. smallint ist eindeutig eine schlechte Wahl.
  2. integer ist eine anständige Wahl für den Moment, aber Ihre Software wird im Jahr 2038 explodieren. Die Y2K-Apokalypse hat nichts auf der Year 2038 Problem.
  3. Mit bigint ist die beste Wahl. Dies ist zukunftssicher gegen die meisten denkbaren menschlichen Bedürfnisse, obwohl the Doctor kann noch criticise es.

Sie können oder prüfen, möglicherweise nicht, ob es nicht am besten sein könnte Ihren Zeitstempel in einem anderen Format wie der ISO 8601 Standard zu speichern.

+0

sehr gute Antwort und sehr gut illustriert die Vor- und Nachteile von jedem Datentyp – Freaktor

Verwandte Themen