Ответ 1
Для конкретного примера, который вы использовали по вашему вопросу (год 1200), технически все будет работать.
В целом, однако, временные метки не предназначены для этого использования. Во-первых, ограничение диапазона произвольно: в MySQL это 1 января, 1000. Если вы работаете с материалами 12-13 века, все идет хорошо... но если в какой-то момент вам нужно добавить что-то более старое (10-й век или ранее), дата будет ужасно ломаться, и для исправления проблемы потребуется переформатировать все ваши исторические даты в нечто более адекватное.
Временные метки обычно представляются в виде необработанных целых чисел с заданным "интервалом тика" и "точкой эпохи", поэтому число действительно представляет собой количество тиков, прошедших с эпохи до представленной даты (или наоборот) для отрицательных дат. Это означает, что, как и любой фиксированный целочисленный тип данных, набор представимых значений конечен. Большинство форматов timestamp, которые я знаю о диапазоне жертвоприношений в пользу точности, в основном потому, что приложения, которые должны выполнять арифметику времени, часто должны делать это с достойной точностью; в то время как приложения, которые должны работать с историческими датами, очень редко нуждаются в серьезной арифметике.
Другими словами, временные метки предназначены для точного представления дат. Вторая (или даже фракция второй) прецессии не имеет смысла для исторических дат: не могли бы вы рассказать мне, до миллисекунды, когда Генрих 8-й короновал как король Англии?
В случае MySQL формат по определению определяется как "4-значные годы", поэтому любая связанная оптимизация может основываться на предположении, что год будет иметь 4 цифры, или что вся строка будет иметь ровно 10 символов ( "yyyy-mm-dd" ) и т.д. Это просто удача, что дата, указанная вами в вашем названии, все еще подходит, но даже полагаться на это все еще опасно: помимо того, что сама база данных может хранить, вам нужно знать от того, что может обрабатывать остальная часть вашего стека серверов. Например, если вы используете PHP для взаимодействия с вашей базой данных, попытка обработки исторических дат очень вероятно сбой в какой-то момент (в 32-разрядной среде, диапазон для временных меток в стиле UNIX - 13 декабря 1901 г. 19 января 2038 г.).
Вкратце: MySQL будет правильно хранить любую дату с 4-значным годом; но в целом с использованием временных меток для исторических дат почти гарантированно чаще возникают проблемы и головные боли. Я настоятельно рекомендую против такого использования.
Надеюсь, что это поможет.
Edit/дополнение:
Благодарим вас за это самое интересное ответ. Должен ли я создать свой собственный алгоритм для исторической даты или выбрать другой db, но какой? - user284523
Я не думаю, что у какой-либо БД слишком много поддержки для таких дат: приложения, использующие его, чаще всего имеют достаточное количество строк/текста. Фактически, для дат в году 1 и позже текстовое представление даже даст правильную сортировку/сравнение (при условии, что дата представлена на порядок: y, m, d order). Однако сравнения будут нарушены, если также будут задействованы "отрицательные" даты (они все равно будут сравниваться как раньше, чем любые положительные, но сравнение двух отрицательных дат даст обратный результат).
Если вам нужны только даты года 1 и более поздние даты, или если вам не нужна сортировка, вы можете сделать вашу жизнь намного проще, используя строки.
В противном случае наилучшим подходом является использование какого-то числа и определение ваших собственных "интервалов тика" и "точки эпохи". Хорошим интервалом может быть несколько дней (если вам не нужна дальнейшая прецессия, но даже тогда вы можете полагаться на "реальные" (с плавающей запятой) цифры вместо целых чисел); и разумная эпоха может быть 1 января, 1. Основная проблема будет превращать эти значения в их текстовое представление и наоборот. Вы должны иметь в виду следующие детали:
- Високосные годы имеют один дополнительный день.
- Правило для високосных годов было "любое кратное 4" до 1582 года, когда оно изменилось с юлианского на григорианский календарь и стало "кратным 4, за исключением кратных 100, если они также не кратно 400".
- Последний день юлианского календаря состоялся 4 октября 1582. На следующий день, первый из григорианского календаря, было 15 октября 1582. 10 дней были пропущены, чтобы новый календарь соответствовал сезонам.
- Как указано в комментариях, два вышеперечисленных правила варьируются в зависимости от страны: папские государства и некоторые католические страны приняли новый календарь в указанные сроки, но многие другие страны заняли больше времени (последний из них был Терли в 1926 году), Это означает, что любая дата между папским быком в 1582 году и последним принятием в 1926 году будет неоднозначной без географического контекста и еще более сложной для обработки.
- Нет "года 0": год до года 1 был годом -1 или годом 1 BCE.
Все это требует довольно сложных функций парсера и форматирования, но помимо многих разбросанных по отдельности случаев на самом деле не слишком много сложностей (было бы скучно кодовому, но довольно прямолинейно). Использование чисел в качестве основного представления обеспечивает правильную сортировку/сравнение для любой пары значений.
Зная это, теперь вы выбираете подход, который лучше подходит вашим потребностям.