sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man väldigt gamla datum i databasen?

Du kan faktiskt lagra datum under år 1000 i MySQL trots dokumentation förtydligande:

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

-du måste fortfarande ange år 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)

-och du kommer att kunna arbeta med detta som ett datum :

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

När det gäller säkerheten. Jag har aldrig ställts inför ett fall då detta inte kommer att fungera i MySQL 5.x (det betyder naturligtvis inte att det kommer att fungera till 100 %, men det är åtminstone tillförlitligt med viss sannolikhet)

Om f.Kr. datum (under Kristus). Jag tror att det är enkelt - i MySQL finns det ingen möjlighet att lagra negativa datum också. d.v.s. du måste lagra år separat som ett signerat heltalsfält:

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 jag tror att det i alla fall (under/över år 0) är bättre att lagra datumdelar som heltal i så fall - detta kommer inte att förlita sig på odokumenterade funktioner. Du måste dock arbeta med dessa tre fält som inte är datumen (så i någon mening är det inte en lösning på ditt problem)



  1. SQL-fråga problem

  2. Håll MySQL-schemat synkroniserat mellan datorer

  3. MySQL-gruppera efter datum och antal inklusive saknade datum

  4. hänvisar till flera främmande nycklar php mysql