Как хранить приблизительные даты в MySQL? - PullRequest
4 голосов
/ 04 мая 2009

Мне нужно хранить такие даты, как «Лето 1878» или «Начало июня 1923 года» или даже «Полдень во вторник в августе». Как бы вы посоветовали мне это сделать?

Я рассмотрел разбиение даты и времени на отдельные (целочисленные) столбцы и наделение каждого столбца вспомогательным (целочисленным) столбцом, содержащим диапазон (0, если точно; NULL, если неизвестно). Но я уверен, что есть и другие способы ...

Спасибо!

Ответы [ 8 ]

3 голосов
/ 04 мая 2009

Почти независимо от того, что вы делаете, вы почти наверняка не сможете получить базу данных, которая сделает за вас тяжелую работу. Таким образом, у вас есть два варианта: 1 - Используйте натуральные строки, как вы описали 2 - Храните точные данные, а также точность этой даты

Например, вы можете сохранить «5:10:23 вечера 23 сентября 1975 года», «плюс или минус 6 месяцев», и когда кто-то захочет найти записи, которые произошли в этот период, это может всплыть.

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

3 голосов
/ 04 мая 2009

Я использую Postgres, и я хотел сделать то же самое. Возможно, вы можете сделать это так же, как я, если MySQL имеет несколько похожих геометрических типов: http://www.electricwords.org/2008/11/fuzzy-date-matching-in-postgresql/

2 голосов
/ 04 мая 2009

Поскольку в «Полдень во вторник в августе» («Воскресный полдень на острове Ла-Гранд-Жатт»?) Не указан год, единственное реальное решение - это ваша таблица всех компонентов даты и времени, все обнуляемые.

В противном случае вы объединяете свои данные.

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

Если вы можете указать хотя бы диапазон, вы можете сделать это:

create table artwork {
  artwork_id int not null primary key,
  name varchar(80),
  ... other columns
  date_description varchar(80),
  earliest_possible_creation_date datetime
  latest_possible_creation_date datetime
}

insert into artwork( 
  name, 
  date_description, 
  earliest_possible_creation_date, 
  latest_possible_creation_date
) values ( 

  'A Sunday Afternoon on the Island of La Grande Jatte',
  'Mid-afternoon on a Tuesday in August'
  '1884-01-01',
  '1886-12-31'
), (
  'Blonde Woman with Bare Breasts',
  'Summer 1878'
  '1878-05-01',
  '1878-08-31'
), (
   'Paulo on a Donkey',
   'Early June 1923',
   '1923-06-01'
   '1923-06-15'
);

Это позволяет вам отображать все, что вы хотите, и искать:

select * from artwork 
where @some_date between 
earliest_possible_creation_date and latest_possible_creation_date;

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

1 голос
/ 04 мая 2009

Я не думаю, что какое-либо собственное представление даты MySQL будет работать для вас. Ваше двухколоночное решение будет работать хорошо, если в сочетании с меткой времени Unix (генерируется с функцией UNIX_TIMESTAMP() с датой MySQL в качестве аргумента). Используйте второй столбец (ширину диапазона) для верхней и нижней границ в ваших выборках и убедитесь, что столбец даты проиндексирован.

0 голосов
/ 25 июня 2009

В итоге я решил: столбец для каждого из компонентов даты (год, месяц, день, час, минута, секунда) и сопутствующие столбцы для диапазона каждого из них (year_range, month_range, day_range, hour_range , minute_range, second_range), главным образом потому, что этот метод позволяет мне указать, что я знаю уверен , что конкретная фотография была сделана в августе (например) в конце 60-х годов (год = 1868, год_ранж = 2 , month = 8, month_range = 0).

Спасибо всем за помощь!

0 голосов
/ 04 мая 2009

Используйте две даты и определите дату начала и окончания нечеткой области. Для таких вещей, как лето 1878, введите 18780621–18780920. Для начала июня 1923 г. вы должны решить, когда рано закончится, может быть, с 19230601 по 19230610. Это позволяет выбирать значения. Возможно, вы все равно захотите отфильтровать потом, но это приблизит вас.

Для тех, у кого нет лет, вам придется найти другую систему.

0 голосов
/ 04 мая 2009

Если исходить из ответа Криса Аргуина, во втором столбце просто есть еще один столбец даты и времени, который вы можете использовать для хранения +/-, тогда вы сможете написать запрос, использующий оба столбца для получения приблизительного значения времени и даты.

0 голосов
/ 04 мая 2009

создайте таблицу со списком значений, которые вы можете захотеть, например, «Ранний» или «Летний». тогда, что бы вы ни настраивали, у вас может быть алгоритм, который устанавливает внешний ключ в зависимости от даты.

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