Всъщност вие можете съхранявайте дати под година 1000 в MySQL въпреки дори документацията уточнение:
mysql> describe test; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | birth | date | YES | | NULL | | +-------+---------+------+-----+---------+-------+
- все още трябва да въведете година във формат ГГГГ:
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)
Колкото до безопасността. Никога не съм се сблъсквал със случай, когато това няма да работи в MySQL 5.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 полета, а не като датите (така че в известен смисъл това не е решение на проблема ви)