実際、できます ドキュメント にも関わらずMySQLに1000年未満の日付を保存する 明確化:
mysql> describe test; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | birth | date | YES | | NULL | | +-------+---------+------+-----+---------+-------+
-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)
-これを日付として操作できるようになります :
mysql> select birth + interval 5 day from test; +------------------------+ | birth + interval 5 day | +------------------------+ | 0995-03-10 | +------------------------+ 1 row in set (0.03 sec)
安全性も。これがMySQL5.xで機能しないというケースに直面したことはありません(これは、100%機能するという意味ではありませんが、少なくとも一定の確率で信頼できるという意味です)
紀元前の日付について(キリストの下)。それは簡単だと思います-MySQLには方法はありません 負の日付も保存します。つまり年を符号付き整数フィールドとして個別に格納する必要があります:
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)
しかし、いずれの場合も(0年より下/上)、その場合は日付部分を整数として格納する方がよいと思います。これは、文書化されていない機能に依存しません。ただし、日付としてではなく、これら3つのフィールドを操作する必要があります(したがって、ある意味では、問題の解決策ではありません)