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

Hvordan gemmer man meget gamle datoer i databasen?

Faktisk kan du gem datoer under år 1000 i MySQL på trods af selv dokumentation præcisering:

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

-Du skal stadig indtaste årstal i formatet ÅÅÅÅ:

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)

-og du vil være i stand til at arbejde med dette som en dato :

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

Hvad angår sikkerheden. Jeg har aldrig stået over for et tilfælde, hvor dette ikke vil fungere i MySQL 5.x (det betyder naturligvis ikke, at det vil fungere 100 %, men i det mindste er det pålideligt med en vis sandsynlighed)

Om f.Kr.-datoer (under Kristus). Jeg tror, ​​det er enkelt - i MySQL er der ingen måde at gemme negative datoer også. dvs. du bliver nødt til at gemme år separat som et signeret heltalsfelt:

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)

Men jeg tror, ​​at det under alle omstændigheder (under/over år 0) er bedre at gemme datodele som heltal i så fald - dette vil ikke være afhængigt af udokumenterede funktioner. Du bliver dog nødt til at arbejde med disse 3 felter, der ikke er datoen (så på en eller anden måde er det ikke en løsning på dit problem)



  1. Sådan duplikeres tabel i MySQL

  2. MySQL - CASE vs IF Statement vs IF funktion

  3. MySQL fuldtekstsøgning på flere tabeller med forskellige felter

  4. SQL-masseimport fra CSV