Как я могу выбрать все записи между двумя датами, не используя поля даты? - PullRequest
3 голосов
/ 05 января 2011

У меня есть MySQL DB, и мне нужно иметь возможность хранить даты ранее 1970 года, поэтому мне нужен собственный способ хранения дат. В моем случае я должен иметь возможность хранить даты вплоть до настоящего времени и так же далеко, как история. Очевидно, что более ранние события в истории требуют меньшей точности - дни, месяцы и даже годы становятся менее важными, поскольку у нас нет этой исторической информации. Основным запросом, включающим даты, будет выбор записей между двумя указанными датами.

Я подумал использовать этот формат:

Year - int(6) | Month - tinyint(2) | day - tinyint (2) | time - time | AD tinyint (1) | mya - int (11)
Но когда дело доходит до фактического использования данных в этом формате, это становится трудным. Например, если я хочу получить все записи между двумя датами, это будет выглядеть так (псевдокод не SQL):

get all where year between minYear and maxYear<br> if year == minYear, month >= minMonth<br> if year == maxYear, month <= maxMonth<br> if month == minMonth, day >= minDay<br> if month == maxMonth, day <= maxDay<br> if day == minDay, time >= minTime<br> if day == maxDay, time <= maxTime

или что-то похожее на правильную боль. Я мог хранить секунды до / после 0 года нашей эры, но это заняло бы слишком много данных! 2011 = 6,4 миллиарда секунд с 0 года нашей эры. У кого-нибудь есть идеи по этой проблеме?

Ответы [ 3 ]

2 голосов
/ 05 января 2011

Я бы запомнил количество дней с данного дня.Существуют различные даты, которые можно использовать в качестве нулевого дня.Они в общем известны как юлианские дни, см. wikipaedia

Поскольку вы храните даты с 0 г. н.э., я бы посмотрел на Хронологический юлианский день (CJD), чтобы все ваши значения были положительными.

В качестве побочного эффекта это означает, что вам нужно смотреть только на работу с разными календарями (например, когда они изменились на григорианский и когда изменилось начало года, или использовать исламские календари), когда вы переходите на или с даты, когда вы знаетеболее подробную информацию о фактической дате,

Если интересуют даты, не беспокойтесь о секундах, так как это усложняет ненужные вещи, а также означает, что вам приходится иметь дело с большими данными (т. е. длиннее длинных), временными зонами и т. д....

1 голос
/ 05 января 2011

Вам нужна хотя бы одна дата, чтобы создать интервал.Я использую одно поле даты для start_date и интервал, который может быть числом секунд или фиксированным интервалом, например ENUM (день, месяц, год).Это зависит от данных, с которыми вы работаете.

Для ДАТА поддерживаемый диапазон от '1000-01-01 00:00:00' до '9999-12-31 23:59:59 ', но это означает, что, хотя более ранние значения могут работать, нет никакой гарантии.Я вижу, что вы можете без проблем использовать 0001-01-01.

ДЛЯ значений BC. Я не знаю, существует ли стандарт, но я видел системы, в которых указана собственная начальная точка,Допустим, ваши данные будут до нашей эры, но не дольше 1000 г. до н.Вы можете указать свой 0 год как -2000, применить разницу (год-2000) ко всем датам и, возможно, даже создать класс Date, который применяется только к вашему проекту.Вы можете назначить время как целое число и выполнять все операции с ним без проблем, особенно если вы не работаете с днями или месяцами детализации.Текущие календари не являются надежными для работы в прошлом, так как точность даты была неверно рассчитана на протяжении веков и исправлена ​​некоторыми исправлениями, которые могут сделать вычисления довольно трудными.формат, так как это позволит вам выполнять быстрые операции DATE непосредственно в mySql.

Обновление для расчета високосных годов в вашем классе:

if year modulo 400 is 0
   then is_leap_year
else if year modulo 100 is 0
   then not_leap_year
else if year modulo 4 is 0
   then is_leap_year
else
   not_leap_year
1 голос
/ 05 января 2011

Это скорее зависит от того, какие запросы вы хотите выполнить.

Вы можете хранить даты в виде строк ГГГГММДДЧЧММСС, которые будут сортировать в хронологическом порядке и позволять вам находить даты в диапазоне. См. Также ISO 8601 http://en.wikipedia.org/wiki/ISO_8601

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...