Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare date molto vecchie nel database?

In realtà, puoi memorizzare date inferiori all'anno 1000 in MySQL nonostante la documentazione chiarimento:

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

- devi ancora inserire l'anno nel 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)

-e sarai in grado di operare con questo come data :

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

Quanto alla sicurezza. Non ho mai affrontato un caso in cui questo non funzionerà in MySQL 5.x (questo, per causa, non significa che funzionerà al 100%, ma almeno è affidabile con una certa probabilità)

A proposito di date aC (sotto Cristo). Penso che sia semplice:in MySQL non c'è alcun modo per memorizzare anche le date negative. Cioè. dovrai memorizzare l'anno separatamente come campo intero con segno:

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)

Ma penso che, in ogni caso (sotto/sopra l'anno 0) sia meglio memorizzare le parti della data come numeri interi in quel caso - questo non si baserà su funzionalità non documentate. Tuttavia, dovrai operare con quei 3 campi non come le date (quindi, in un certo senso questa non è una soluzione al tuo problema)