sql >> Database >  >> RDS >> Mysql

Hoe zeer oude datums in de database op te slaan?

Eigenlijk kunt u bewaar datums onder het jaar 1000 in MySQL ondanks zelfs documentatie verduidelijking:

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

-je moet nog steeds het jaartal in YYYY-formaat invoeren:

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)

-en u kunt hiermee werken als een datum :

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

Wat betreft veiligheid. Ik heb nog nooit een geval meegemaakt waarin dit niet werkt in MySQL 5.x (dat betekent natuurlijk niet dat het 100% zal werken, maar het is in ieder geval betrouwbaar met een zekere waarschijnlijkheid)

Over BC data (onder Christus). Ik denk dat dat eenvoudig is - in MySQL is er geen manier om ook negatieve datums op te slaan. D.w.z. u moet het jaar apart opslaan als een ondertekend geheel getalveld:

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)

Maar ik denk dat het in ieder geval (onder/boven jaar 0) in dat geval beter is om datumdelen als gehele getallen op te slaan - dit is niet afhankelijk van ongedocumenteerde functies. U zult echter met die 3 velden moeten werken, niet als de datums (dus in zekere zin is dat geen oplossing voor uw probleem)



  1. Hoe ATAN() werkt in MariaDB

  2. Synchroniseer offline SQLite-database met online MySQL-database

  3. Parameters doorgeven aan mysql

  4. In plaats van LIKE en ~, waarom werkt alleen VERGELIJKBAAR MET als regex-match met alternatieven wordt uitgevoerd?