2012-08-03 24 views

Respuesta

2

número entero sería bueno, pero no es suficiente, ya que PostgreSQL no es compatible con los tipos sin signo

+0

Creo que puedo contrarrestarlo con un cheque para que se comporte como un número sin firmar. – ThinkingMonkey

+1

hasta 2038 esto no es un problema :) – CyberDem0n

+0

probablemente use bigint entonces. Pero no sería bueno almacenar los bits adicionales. – ThinkingMonkey

19

me acaba de ir con el uso de TIMESTAMP CON (OUT) del huso horario y utilizar el extracto para obtener una representación de marca de tiempo UNIX cuando lo necesite .

Compare

SELECT NOW(); 

con

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

Como digo, quiero almacenar marcas de tiempo de Unix. ¿El tipo de datos timestamp almacena el literal 'timestamp unix'? – ThinkingMonkey

+0

'TIMESTAMP WITH (OUT) TIME ZONE' no almacena los timestamps literales. – ThinkingMonkey

+0

Realmente no creo que se requiera el voto a favor. Postgres no tiene un tipo de datos que literalmente se correlacione con la marca de tiempo de Unix. Tienes que usar la marca de tiempo postgres o un tipo no temporal. Si hace esto último, no podrá usar SQL para comparar marcas de tiempo – GordonM

4

No entiendo por qué la pregunta tiene algunos votos negativos

De todos modos, encontré closely related question en el sitio Administradores de bases de datos (con muchos votos positivos).

Esto es sólo para sugerir que eche un vistazo allí, ya que hay una información mucho más completa sobre este tema no trivial.

+0

Gracias por el enlace. y por mencionar que este es un tema no trivial. +1. – ThinkingMonkey

36

La marca de tiempo de época de Unix ahora (2014-04-09) es 1397071518. Por lo tanto, necesitamos un tipo de datos capaz de almacenar un número al menos tan grande.

¿Qué tipos de datos están disponibles?

Si se refiere a la PostgreSQL documentation on numeric types encontrará las siguientes opciones:

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

¿Qué significa eso en términos de representación del tiempo?

Ahora, podemos tomar esos números y convertirlos en fechas utilizando 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 

Tenga en cuenta que, en última instancia, el uso de segundos te pone tan lejos en el pasado y el futuro que probablemente no importa El resultado que he dado es para si representas la época de Unix en milisegundos.

Entonces, ¿qué hemos aprendido?

  1. smallint es claramente una mala elección.
  2. integer es una opción decente por el momento, pero su software explotará en el año 2038. El apocalipsis Y2K no tiene nada en el Year 2038 Problem.
  3. El uso de bigint es la mejor opción. Esto es a prueba de futuro contra la mayoría de las necesidades humanas concebibles, aunque the Doctor todavía puede criticise.

Puede o no considerar si no sería mejor almacenar su marca de tiempo en otro formato como el ISO 8601 estándar.

+0

muy buena respuesta y muy bien ilustrado los pro y los contras de cada tipo de datos – Freaktor

Cuestiones relacionadas