Как хранить (и сортировать) неопределенные диапазоны дат?
У меня есть база данных, которая должна хранить диапазоны года (например, продолжительность жизни), которые в некоторых случаях не очень специфичны. Например, как и обычный "1960", мы имеем "c. 1960 'для" около 1960 года "и 1960-е годы в течение десятилетия 1960 года, а также" nd" без даты, которая явно отличается от NULL, которая будет до настоящего времени.
Каким будет лучший способ их хранения?
Я подумывал о том, чтобы, возможно, сохранить год как строку и добавить 's' в течение десятилетий и 'c' для около, с 'nd' для даты нет... но это кажется просто неправильным. Кроме того, при сортировке в хронологическом порядке мне нужно сортировать, вставляя элементы 1960-х годов до c. 1960, которые, в свою очередь, относятся к периоду до 1960 года.
Как это сделать правильно?
Некоторые примерные диапазоны дат:
1957
с. 1957
с. 1957 - 1965
с. 1957 - 1960-е годы
с. 1957 г. - настоящее время
с. 1957 - nd
Спасибо за вашу помощь!
Ответы
Ответ 1
Вы можете вставить самую раннюю и самую последнюю дату для диапазона.
Например, точная дата будет
Jan 1, 1960 Jan 1, 1960
c. 1960 будет
Jan 1, 1960 Dec 31, 1960
1960-е годы будут
Jan 1, 1960 Dec 31, 1969
и др.
Затем вы можете заказать первую дату и дату:
SELECT *
FROM mytable
ORDER BY
start_date, DATEDIFF(end_date, start_date) DESC
В качестве альтернативы вы можете сохранить ожидаемое значение и отклонение вместо дат начала и окончания.
Ответ 2
Это звучит как проблема типа "нечеткой логики". Я бы занялся этим, используя несколько столбцов:
- Самое раннее Возможная дата
- Самое раннее Определенная дата
- Последняя определенная дата
- Последняя возможная дата
Ваши примеры могут быть представлены как
- 1957,1957,1957,1957
- 1955,1957,1957,1959
- 1955,1959,1965,1965
- 1955,1959,1960,1969
- 1955,1959, NULL, NULL
- 1955,1959,9999,9999
Я предполагаю, что "c" означает +/- 2 года, десятилетие работает от "0 до" 9, а 9999 - значение флага для "nd"
Любое использование?
Ответ 3
Я думаю, что ответ Quassnoi хорош, альтернативно вы можете генерировать измерение времени, затем ссылаться на него в виде симуляции (хотя ваше измерение может не совпадать нужно столько строк)?
Ответ 4
Вам нужно предопределить, какая ваша структура является OR или допускать переменность. Цирка часто ассоциируется с классификацией артефактов (книг, фотографий, писаний) и других объектов (неизвестные точные даты рождения/смерти), где можно найти широкую разновидность. Имейте в виду, что реклассификация артефактов часто происходит по мере получения дополнительной информации. Таким образом, что Макс определил работы, но я бы также добавил определенную дату классификации и, возможно, столбец с описанием и/или именем классификатора/сущности, определяющих классификацию. Вы можете определить, нужны ли вам исторические записи о реклассификации и как их обрабатывать.
Еще один пункт примечания относительно таких вещей - какой календарь был установлен, определяя фактическую дату дня, например, дату 4 октября (Джулиан), следовала дата 15 октября (григорианская), которая была изменением сделанное в 1582 году и аналогичное изменение в 1751 году, которое изменило британский и его колоний в григорианский календарь. Таким образом, вам нужно определить используемый календарь, который можно перевести на календари текущего дня.
В этом случае вам нужен также идентификатор используемого календаря, связанный с определением, и укажите это также.
Кроме того, некоторые события связаны с месяцами, обозначенными как "первый месяц, второй месяц и т.д." которые, возможно, путают, как, например, квакеры меняются, где "первый месяц" в 1751 году был в марте, но в 1752 году он был январем - особенно отмечен, когда генеалогия является предметом (как вы подразумеваете), а рождаемость/смерть - это события.
Для удовольствия, бросьте в Цезер и Календари (первый день марта) и его реформу високосного года/дня, когда 24 февраля был високосный день как "второй шестой день, предшествующий Календари", так что было два 24 февраля (два 6-й день) в високосные годы.
Я указываю это, потому что количество дней в високосный год может в некоторых случаях изменять периоды.
Итак, используйте такую структуру, как Max и/или Quassnoi, но, возможно, немного больше для деления.
Цитата для календарей и понимания: Что такое календарь
Ответ 5
"Как хранить (и сортировать) неопределенные диапазоны дат?"
(A) Проанализируйте с более высоким уровнем проверки, что значит быть диапазоном дат. Это означает, что есть точная дата начала и точная дата окончания диапазона.
(B) Пусть анализируется с более высоким уровнем проверки, что это может означать "undefined" диапазон дат. Для меня кажется, что это какой-то диапазон дат, в котором либо дата начала, либо дата окончания, либо и то, и другое не точно известны, но в которых один (или оба) из них представляют собой диапазон.
(C) Известно, что обычное математическое понятие "упорядочения" (так называемый "общий порядок" ) нецелесообразно относится к понятию "диапазоны" (как бы вы решили, что 1-3 либо больше или меньше 0-6?). Теоретически можно определить такой порядок, на основе, например, "порядок по датам начала сначала и в равные даты начала, в конце даты", но такой порядок никогда не бывает полезен.
(D) И если "дата начала" и/или "дата окончания" диапазона сами являются "неопределенными" (т.е. эти компоненты сами являются диапазонами), тогда очевидно, почему безумно пытаться и осмысленно упорядочить такие диапазоны.
Итак, ответ на часть "(и сортировка)": "У вас нет, потому что вы не можете (значимым образом)".