web-dev-qa-db-fra.com

Type de champ PostgreSQL pour l'horodatage Unix?

Type de champ PostgreSQL pour l'horodatage Unix:

  • pour le stocker comme horodatage unix
  • pour le récupérer également comme horodatage Unix.

Ont traversé Types de date/heure postgreSQL V 9.1 .


  • Est-ce que l'entier est la meilleure solution?! (c'est ce que j'avais fait quand j'utilisais MySQL. J'avais utilisé int(10))
47
ThinkingMonkey

entier serait bon, mais pas assez bon, car postgresql ne prend pas en charge les types non signés

3
CyberDem0n

L'horodatage Unix Epoch en ce moment (2014-04-09) est 1397071518. Nous avons donc besoin d'un type de données capable de stocker un nombre au moins aussi grand.

Quels types de données sont disponibles?

Si vous vous référez à PostgreSQL documentation sur les types numériques vous trouverez les options suivantes:

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

Qu'est-ce que cela signifie en termes de représentation temporelle?

Maintenant, nous pouvons prendre ces nombres et les convertir en dates à l'aide d'un convertisseur d'époque :

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

Notez que dans le dernier cas, l'utilisation des secondes vous place si loin dans le passé et le futur que cela n'a probablement pas d'importance. Le résultat que j'ai donné est pour si vous représentez l'époque unix en millisecondes.

Alors, qu'avons-nous appris?

  1. smallint est clairement un mauvais choix.
  2. integer est un choix décent pour le moment, mais votre logiciel explosera en l'an 2038. L'apocalypse Y2K n'a rien sur le problème de l'an 2038 .
  3. Utiliser bigint est le meilleur choix. Ceci est à l'épreuve du futur contre la plupart des besoins humains imaginables, bien que le docteur = peut encore critiquer cela.

Vous pouvez ou non vous demander s'il n'est pas préférable de stocker votre horodatage dans un autre format tel que la norme ISO 8601 .

68
Richard

Je voudrais simplement utiliser TIMESTAMP WITH (OUT) TIME ZONE et utiliser EXTRACT pour obtenir une représentation d'horodatage UNIX lorsque vous en avez besoin.

Comparer

SELECT NOW();

avec

SELECT EXTRACT(Epoch FROM NOW());
23
GordonM

Je ne comprends pas pourquoi la question a des votes négatifs.

Quoi qu'il en soit, j'ai trouvé un question étroitement liée dans le site Administrateurs de base de données (avec de nombreux votes positifs).

Il s'agit simplement de suggérer d'y jeter un œil, car il existe des informations beaucoup plus complètes sur ce sujet non trivial.

6
jap1968