Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để lưu trữ các ngày rất cũ trong cơ sở dữ liệu?

Trên thực tế, bạn có thể lưu trữ các ngày dưới 1000 năm trong MySQL mặc dù có cả tài liệu làm rõ:

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

-bạn vẫn cần nhập năm ở định dạng YYYY:

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)

-và bạn sẽ có thể hoạt động với điều này như một ngày :

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

Đối với sự an toàn. Tôi chưa bao giờ đối mặt với trường hợp điều này sẽ không hoạt động trong MySQL 5.x (nguyên nhân không có nghĩa là nó sẽ hoạt động 100%, nhưng ít nhất nó đáng tin cậy với xác suất nhất định)

Khoảng niên đại trước Công nguyên (dưới Công nguyên). Tôi nghĩ điều đó thật đơn giản - trong MySQL thì không có cách nào để lưu trữ ngày âm. I E. bạn sẽ cần lưu trữ năm riêng biệt dưới dạng trường số nguyên có dấu:

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)

Nhưng tôi nghĩ, trong mọi trường hợp (dưới / trên năm 0) tốt hơn nên lưu trữ các phần ngày tháng dưới dạng số nguyên trong trường hợp đó - điều này sẽ không dựa vào tính năng không có tài liệu. Tuy nhiên, bạn sẽ cần phải thao tác với 3 trường đó không phải là ngày tháng (vì vậy, theo một nghĩa nào đó, đó không phải là giải pháp cho vấn đề của bạn)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết lập JDBC chung

  2. MySql vs NoSql - Cấu trúc và triển khai dữ liệu nhận xét và thông báo trên mạng xã hội

  3. Trình điều khiển PDO MySQL trên Mac

  4. Mysql chọn (n) hàng của mỗi lần xuất hiện

  5. MySQL Full Text Search Mystery