Если точная дата не известна, но надо сохранить, то что известно, например (формат DD.MM.YYYY):
1) 21.06.???? - год не известен, но известно, что это 2011 +/- 3 года.
2) 21.??.2011 - месяц не известен, но известно, что это весна, возможно Март +/- 2 месяца
3) ??.03.2011 - дня нет, однако, вероятно, что это во вторая половина Марта, т.е. с 15 по 31
В то же время, могут вводиться полные даты.
По-простому можно реализовать так:
- в форме ввода даты три раздельных поля MM, DD, YYYY
- к этим трём полям есть три check-boxes, означающих примерное или точное введёное значение
- если примерное, то к введёному примерному значению есть ещё одно дополнительное поле, где вводится значение отклонения (+/-), например, 3 и 2 как в примерах 1 и 2.
Т.е., всего 9 не всегда заполняемых полей.
Но даже в этом сильно избыточном подходе непонятно, как это всё сохранить в БД в максимально компактном виде (с минимальным количеством полей) с одной стороны, а с другой стороны, чтобы сохранение-хранение/извлечение/индексирование/фильтрование/обработка занимали минимум времени-места.
Гуглил, но безрезультатно.
Кто нибудь встречался с оптимальными вариантами решения подобной проблемы?
Заранее спасибо!
Как хранить в БД неполные/неточные даты?
-
- Уже с Приветом
- Posts: 552
- Joined: 25 Oct 2004 09:34
- Location: Russia ->Toronto
Как хранить в БД неполные/неточные даты?
Last edited by XelaX on 22 Jun 2016 05:39, edited 2 times in total.
-
- Уже с Приветом
- Posts: 1781
- Joined: 11 Jan 2001 10:01
- Location: Томск->Дубровка (ON)
Re: Как хранить в БД неполные/неточные даты?
В одном поле - скорее никак. Будет либо компактно, либо удобно, либо точно.
Надо определиться, как оно потом будет использоваться.
Да и откуда оно приходит такое, кто решает насчёт примерных дат?
Я бы хранил в нескольких полях:
- Собственно оригинальный вариант:
- строкой в каком-нибудь стандартном написании типа YYYY-MM-DD , с placeholders на месте неизвестных частей (можно и без этого поля, кмк)
- эту примерную дату как дату/время
- отклонение (+/-) value + units - два отдельных поля.
- Флаг (точное|примерное) значение ... он из оригинального варианта может быть получен - если в строке есть placeholder. Можно и без него обойтись. Разве что просто для истории. Отклонение может его заменить.
- Примерный/точный период: начало и конец как отдельные поля дата/время, значения получены так как у вас указано. Может быть даже вычислено из оригинального варианта + отклонение.
(для точных/полных дат начало и конец бы совпадали)
Тогда поиск бы был всегда по периоду. По нему же можно и индексировать.
Надо определиться, как оно потом будет использоваться.
Да и откуда оно приходит такое, кто решает насчёт примерных дат?
Я бы хранил в нескольких полях:
- Собственно оригинальный вариант:
- строкой в каком-нибудь стандартном написании типа YYYY-MM-DD , с placeholders на месте неизвестных частей (можно и без этого поля, кмк)
- эту примерную дату как дату/время
- отклонение (+/-) value + units - два отдельных поля.
- Флаг (точное|примерное) значение ... он из оригинального варианта может быть получен - если в строке есть placeholder. Можно и без него обойтись. Разве что просто для истории. Отклонение может его заменить.
- Примерный/точный период: начало и конец как отдельные поля дата/время, значения получены так как у вас указано. Может быть даже вычислено из оригинального варианта + отклонение.
(для точных/полных дат начало и конец бы совпадали)
Тогда поиск бы был всегда по периоду. По нему же можно и индексировать.
Зато её так мало надо, всего две капли на стакан...
-
- Уже с Приветом
- Posts: 11019
- Joined: 15 May 2002 02:09
- Location: Boston, MA
Re: Как хранить в БД неполные/неточные даты?
как вариант заводится одно поле date второе как индикатор what's missing
например если у вас may ?? 1981 в первом поле будет 05/01/1981 во втором 2 - индиктор того что день не точен,
ну и может быть еще одно поле которое указывает насколько не точен.
мне кажется с date должно быть легче работать в некторых случаях....
например если у вас may ?? 1981 в первом поле будет 05/01/1981 во втором 2 - индиктор того что день не точен,
ну и может быть еще одно поле которое указывает насколько не точен.
мне кажется с date должно быть легче работать в некторых случаях....
-
- Уже с Приветом
- Posts: 573
- Joined: 15 Jan 2016 02:50
Re: Как хранить в БД неполные/неточные даты?
Храним 2 даты, начала и конца диапазона неопределенности.XelaX wrote: 1) 21.06.???? - год не известен, но известно, что это 2011 +/- 3 года.
2) 21.??.2011 - месяц не известен, но известно, что это весна, возможно Март +/- 2 месяца
3) ??.03.2011 - дня нет, однако, вероятно, что это во вторая половина Марта, т.е. с 15 по 31
1) 21.06.2008 - 21.06.2014
2) 21.01.2011 - 21.05.2011
3) 15.03.2011 - 31.03.2011
-
- Уже с Приветом
- Posts: 329
- Joined: 09 Sep 2002 17:42
- Location: NH
Re: Как хранить в БД неполные/неточные даты?
Я бы завел child таблицу в которой бы хранил все возможные варианты;
1. 21.06.2008, 21.06.2009, 21.06.2010,21.06.2011,21.06.2012,21.06.2013,21.06.2015
2. 21.01.2011,21.02.2011,21.03.2011,21.04.2011,21.05.2011,21.06.2011
3. 15.03.2011,16.03.2011 - 31.03.2011
1. 21.06.2008, 21.06.2009, 21.06.2010,21.06.2011,21.06.2012,21.06.2013,21.06.2015
2. 21.01.2011,21.02.2011,21.03.2011,21.04.2011,21.05.2011,21.06.2011
3. 15.03.2011,16.03.2011 - 31.03.2011
-
- Уже с Приветом
- Posts: 668
- Joined: 24 Dec 2015 07:50
- Location: Madison, WI
Re: Как хранить в БД неполные/неточные даты?
Если бы мне поставили такую задачу, я бы, наверное, уточнил, какие объёмы данных будут, и как их потом собираются использовать. Т.е. прикинуть типовые запросы к этому хранилищу и, исходя из этого, продумывать структуру.
-
- Уже с Приветом
- Posts: 13682
- Joined: 16 Jan 2001 10:01
Re: Как хранить в БД неполные/неточные даты?
Если пихать в varchar - надобно придумать язык (формат) для описания диапазонов/неточностей.
Мне лично пока нравится идея хранения начала и конца диапазона.
Мне лично пока нравится идея хранения начала и конца диапазона.