Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar datas muito antigas no banco de dados?


Na verdade, você pode armazenar datas abaixo do ano 1000 no MySQL apesar da documentação esclarecimento:
mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| birth | date    | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

-você ainda precisa inserir o ano no formato YYYY:
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)

-e você poderá operar com isso como uma data :
mysql> select birth + interval 5 day from test;                                                                              
+------------------------+                                                                                                   
| birth + interval 5 day |                                                                                                   
+------------------------+                                                                                                   
| 0995-03-10             |
+------------------------+
1 row in set (0.03 sec)

Quanto à segurança. Eu nunca enfrentei um caso em que isso não funcionaria no MySQL 5.x (isso, de causa, não significa que funcionará 100%, mas pelo menos é confiável com certa probabilidade)

Sobre datas aC (abaixo de Cristo). Eu acho que é simples - no MySQL não há nenhuma maneira para armazenar datas negativas também. Ou seja você precisará armazenar o ano separadamente como um campo inteiro assinado:
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)

Mas acho que, em qualquer caso (abaixo/acima do ano 0) é melhor armazenar partes de data como números inteiros nesse caso - isso não dependerá de recursos não documentados. No entanto, você precisará operar com esses 3 campos e não como as datas (portanto, de certa forma isso não é uma solução para o seu problema)