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

Comment stocker des dates très anciennes dans la base de données ?

En fait, vous pouvez stocker les dates inférieures à l'an 1000 dans MySQL malgré même la documentation clarification :

mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| birth | date    | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

-vous devez toujours saisir l'année au format AAAA :

mysql> insert into test values (1, '0995-03-05');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+------+------------+
| id   | birth      |
+------+------------+
|    1 | 0995-03-05 |
+------+------------+
1 row in set (0.00 sec)

-et vous pourrez opérer avec cela comme date :

mysql> select birth + interval 5 day from test;                                                                              
+------------------------+                                                                                                   
| birth + interval 5 day |                                                                                                   
+------------------------+                                                                                                   
| 0995-03-10             |
+------------------------+
1 row in set (0.03 sec)

Quant à la sécurité. Je n'ai jamais été confronté à un cas où cela ne fonctionnerait pas dans MySQL 5.x (cela, bien sûr, ne signifie pas que cela fonctionnera à 100 %, mais au moins c'est fiable avec une certaine probabilité)

À propos des dates de la Colombie-Britannique (en dessous de Christ). Je pense que c'est simple - dans MySQL, il n'y a aucun moyen pour stocker également les dates négatives. C'est à dire. vous devrez stocker l'année séparément sous la forme d'un champ entier signé :

mysql> select '0001-05-04' - interval 1 year as above_bc, '0001-05-04' - interval 2 year as below_bc;
+------------+----------+
| above_bc   | below_bc |
+------------+----------+
| 0000-05-04 | NULL     |
+------------+----------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1441 | Datetime function: datetime field overflow |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

Mais je pense que, dans tous les cas (au-dessous/au-dessus de l'année 0), il est préférable de stocker les parties de date sous forme d'entiers dans ce cas - cela ne dépendra pas d'une fonctionnalité non documentée. Cependant, vous devrez opérer avec ces 3 champs et non comme les dates (donc, dans un certain sens, ce n'est pas une solution à votre problème)