PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Horodatage le plus ancien pris en charge dans PostgreSQL

Le manuel indique les valeurs comme :

  • Valeur basse :4713 avant JC
  • Valeur élevée :294 276 après JC

avec la mise en garde, comme Chris l'a noté, que -infinity est également pris en charge.

Voir la remarque plus loin dans la même page du manuel ; ce qui précède n'est vrai que si vous utilisez des horodatages entiers , qui sont la valeur par défaut dans toutes les versions vaguement récentes de PostgreSQL. En cas de doute :

SHOW integer_datetimes;

vous dira. Si vous utilisez plutôt des dates/heures à virgule flottante, vous obtenez une plus grande plage et moins de précision (non linéaire). Toute tentative de calcul du minimum par programmation doit faire face à cette restriction.

PostgreSQL ne vous permet pas simplement de convertir zéro en un horodatage pour obtenir l'horodatage minimum possible, et cela n'aurait pas beaucoup de sens si vous utilisiez des datetimes à virgule flottante. Vous pouvez utilisez la fonction de conversion de date julienne, mais cela vous donne l'époque pas le temps minimum :

postgres=> select to_timestamp(0);
      to_timestamp      
------------------------
 1970-01-01 08:00:00+08
(1 row)

car il accepte les valeurs négatives. On pourrait penser que lui donner un maxint négatif fonctionnerait, mais les résultats sont surprenants au point que je me demande si nous n'avons pas un bogue enveloppant qui se cache ici :

postgres=> select to_timestamp(-922337203685477);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-92233720368547);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-9223372036854);
         to_timestamp         
------------------------------
 294247-01-10 12:00:55.552+08
(1 row)

postgres=> select to_timestamp(-922337203685);
ERROR:  timestamp out of range
postgres=> select to_timestamp(-92233720368);
          to_timestamp           
---------------------------------
 0954-03-26 09:50:36+07:43:24 BC
(1 row)

postgres=> select to_timestamp(-9223372036);
         to_timestamp         
------------------------------
 1677-09-21 07:56:08+07:43:24
(1 row)

(Peut-être lié au fait que to_timestamp prend un double, même si les horodatages sont stockés sous forme d'entiers de nos jours ?).

Je pense qu'il est peut-être plus sage de laisser la plage d'horodatage être n'importe quel horodatage sur lequel vous n'obtenez pas d'erreur. Après tout, la plage d'horodatages valides n'est pas continue :

postgres=> SELECT TIMESTAMP '2000-02-29';
      timestamp      
---------------------
 2000-02-29 00:00:00
(1 row)

postgres=> SELECT TIMESTAMP '2001-02-29';
ERROR:  date/time field value out of range: "2001-02-29"
LINE 1: SELECT TIMESTAMP '2001-02-29';

vous ne pouvez donc pas supposer que, simplement parce qu'une valeur se situe entre deux horodatages valides, elle est elle-même valide.