Хранение даты в виде кварталов, месяцев и т.д.

SaneSL

Новичок
Хранение даты в виде кварталов, месяцев и т.д.

Добрый день.

Понадобилось сделать таблицу где хранится информация о продукте, в т.ч. и дата его выхода.
Дата может быть точной или приблизительной, к примеру квартал, месяц или год.
Например если известно что дата выхода 2011 год, то в дате будет только 2011 год и при выгрузке нужно показывать только год.

Варианты хранения даты:

4 августа 2010 года.
Сентябрь 2010 года.
IV квартал 2010 года.
2011 год.

Уверен что все это уже давным давно придумано, но поиск результатов не дал.
 

Sepuka

Новичок
Может создать как бы битовое поле для хранения актуальности даты, например первый бит год, второй месяц, третий день. 110 - год и месяц известны, а день в счет не берем, он не актуален. Как-то так...

-~{}~ 04.08.10 16:13:

да, вариант выше - лучше =)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
стоит понимать, что "квартал, месяц, год" - это уже не дата, а диапазон дат. А конкретно в описанном случае, разумней хранить дату и формат отображения. И не надо будет вводить странные ENUM типы :)
 

dimagolov

Новичок
SaneSL, а как отсортировать 1-й квартал 2010, Фев. 2010 и 15 Фев. 2010 ?
 

SaneSL

Новичок
dimagolov, если сделать как сказал флоппик, то вот так:

I квартал 2010 года 2010-01-01
Февраль 2010 года 2010-02-01
15 февраля 2010 года 2010-02-15

И формат отображения для каждого.
 

whirlwind

TDD infected, paranoid
флоппик а че, нормальное решение. Еще можно рядом с новостями шаблоны в соседнем блобе хранить.
 

SaneSL

Новичок
Вообще сам я изначально думал сделать как предлагал флоппик, только без хранения формата отображения.

2010-02-15 00:00:00 - 15 февраля 2010 года
2010-02-01 01:00:00 - Февраль 2010 года
2010-01-01 00:02:00 - II квартал 2010 года
2010-01-01 00:01:00 - I квартал 2010 года
2010-01-01 00:00:01 - 2010 год

А в скрипте проверять если 1 сек. значит в формате даты должен быть только год, если 1 минута значит 1 квартал года, если 2 минуты то второй квартал, если 1 час то месяц. Если время не указано значит полная дата.
 

Urville

Новичок
Ну по сути как раз формат и собирался хранить, только муторно сильно.

Автор оригинала: SaneSL
2010-01-01 00:02:00 - II квартал 2010 года
2010-01-01 00:01:00 - I квартал 2010 года
2010-01-01 00:02:00 - II квартал 2010 года не может быть никак, достаточно просто указать формат - квартал, какой квартал уже определяется датой.
 

SaneSL

Новичок
Вот так будет правильней, просто поторопился:

2010-04-01 00:02:00 - II квартал 2010 года

Сортировка останется по БД. А чтобы не определять квартал датой, поставим в минуты 02, все ровно нужно указывать что это квартал.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Способ имеет то же недостаток, что и с фиктивным ENUM полем - нужно определять, вычислять, обозначать...
а в моем способе ничего не надо - нужно просто применить формат, вполне стандартными функциями, и решение займет ровно 1 строчку.
 

whirlwind

TDD infected, paranoid
Чем не устраивает обычный человеческий способ

2010-02-15 date
2010-02-01 month
2010-01-01 quarter

где работает сортировка, фильтрация, индексация по типам и форматирование в представлении а данные хранятся независимо от языка, локали и формата? Легких путей не ищем?
 

dimagolov

Новичок
whirlwind, флоппик, вообще-то ENUM и "формат вывода" это эквивалентные понятия, поэтому непонятно, о чем спор.

с точки зрения атомарности, прятать формат во время нельзя
 

флоппик

promotor fidei
Команда форума
Партнер клуба
ENUM и "формат вывода"
я написал, чем они отличаются.
Формат вывода, это натурально, строка, которую понимает функция date(). В результате решение сводится к простому
PHP:
echo date($result['item_date'], $result['item_date_format']);
и по умолчанию имеет поддержку локали, различных типов отображения, правильные вычисления этих самых периодов, что в случае всяких кастомных обозначений нужно будет написать реализацию ручками
 

Splurov

Новичок
флоппик
И какое значение будет в $result['item_date_format'] для вывода «IV квартал 2010 года»?
 

whirlwind

TDD infected, paranoid
Splurov да пусть хоть коров там хранят, какая тебе разница
 

SaneSL

Новичок
whirlwind, объясните как в вашем варианте делать сортировку?
 

dimagolov

Новичок
SaneSL, нативно, по полю item_date. в нем или собственно дата, или дата начала периода, вроде уже на примерах тут 10 раз показали...
 
Сверху