sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar fechas muy antiguas en la base de datos?

En realidad, puedes almacenar fechas por debajo del año 1000 en MySQL a pesar de incluso documentación aclaración:

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

-aún necesita ingresar el año en formato 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)

-y podrás operar con esto como una fecha :

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

En cuanto a la seguridad. Nunca me he enfrentado a un caso en el que esto no funcione en MySQL 5.x (eso, por cierto, no significa que funcionará al 100%, pero al menos es confiable con cierta probabilidad)

Sobre las fechas antes de Cristo (por debajo de Cristo). Creo que es simple:en MySQL no hay ninguna manera para almacenar fechas negativas también. Es decir. deberá almacenar el año por separado como un campo entero con signo:

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)

Pero creo que, en cualquier caso (por debajo/por encima del año 0) es mejor almacenar las partes de la fecha como números enteros en ese caso; esto no se basará en una función no documentada. Sin embargo, deberá operar con esos 3 campos, no con las fechas (entonces, en cierto sentido, eso no es una solución a su problema)