powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дата с точностью до месяца
25 сообщений из 25, страница 1 из 1
Дата с точностью до месяца
    #32651967
Разрабатываю уровень хранения данных приложения. И вот какое интересное поле потребовалось - дата с точностью до месяца. То есть, по сути, интересует только число года и номер месяца в году. Озадачился способом хранения такого поля. Пока только два "лобовых" варианта на ум приходят:
а) хранить как дату, при работе не обращать внимания на день;
б) хранить как целое число порядковый номер месяца (за месяц с индексом 1 выбрать какой-либо определенный месяц в прошлом).

В первом случае теряю на избыточном хранении и постоянных операциях разбиения дат на составляющие в операциях сравнения. Во втором случае будет присутствовать некоторая "запутанность" в интерпретации данных (не особо страшно, поскольку логика работы с таким полем будет либо реализована в базе, либо вынесена на уровень компонентов доступа к данным).

Может быть, уважаемые гуру подадут еще какие-то идеи? Или ссылками на статьи по этой теме поделятся. Буду благодарен.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32651980
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте вариант б.
Я его тоже пользую - проблем не заметил.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32651989
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор

Привет земляк, а зачем надо дату разбивать на составляющие ?
Можно ведь числу всегда присваивать 1.

А вообще-то формат DATA в разных базах реализована по разному...
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652006
ololПривет земляк, а зачем надо дату разбивать на составляющие?
Можно ведь числу всегда присваивать 1.
Привет, olol.
Можно и единицу присваивать, конечно. Не суть важно, каким будет число в дате, если его все равно предполагается игнорировать. Есть значения дат, хранящихся в столбце. Есть значение даты для выборки нужных записей. В запросе придется пойти одним из двух путей:
а) сравнивать значения года и месяца (разбиение даты на составляющие);
б) вычислять разницу между датами (использование функции вроде datediff).

авторА вообще-то формат DATA в разных базах реализована по разному...
Ты хотел сказать о типе Date , а не Data . :)
Конкретная реализация на этапе проектирования меня не должна волновать. Достаточно того знания, что во всех современных СУБД есть достаточно функциональности для работы с этим типом данных.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652012
Фотография рубль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Use the CREATE TYPE statement to create the specification of an object type ...
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652049
Фотография рубль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alisher H. Abdurahmanov... Есть значение даты для выборки нужных записей. В запросе придется пойти одним из двух путей:
а) сравнивать значения года и месяца (разбиение даты на составляющие);
б) вычислять разницу между датами (использование функции вроде datediff).

Можно попробывать старый способ - хранить дату в виде числа месяцев относительно определенного года. С индексацией вопросов нет, с выборкой тоже. Единственная заморочка для выделения года и месяца придется делить на 12, целую часть прибовлять к "стартовому" году и получать год, а остаток от деления это и будет месяц.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652052
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор


а) сравнивать значения года и месяца (разбиение даты на составляющие);

Хоть убей не пойму зачем разбивать для сравнения ?

Если это выборка данных за один месяц то:

SELECT * FROM Table WHERE FieldData = :MyData

А если это выборка данных за период то:

SELECT * FROM Table WHERE FieldData >= :FirstData AND FieldData <= :LastData
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652122
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alisher H. Abdurahmanov
б) хранить как целое число порядковый номер месяца (за месяц с индексом 1 выбрать какой-либо определенный месяц в прошлом).

А может проще? 200408 - целое число и угадай как оно "расшифровывается"?
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652135
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще сделать CREATE DISTINCT TYPE на основе CHAR(6),
и написать несколько UDF
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652173
Николай МВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может проще? 200408 - целое число и угадай как оно "расшифровывается"?

Проще сделать CREATE DISTINCT TYPE на основе CHAR(6), и написать несколько UDF


Как дети! :) Кто извилистей рукой до уха достанет? Причем чем "проще", тем извилистее. :)

Храните датой и не морочьте себе голову. Никто не гарантирует, что через пару лет точность изменится до полумесяца или до недели. Жизнь -- штука непредсказуемая.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652260
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай МВ А может проще? 200408 - целое число и угадай как оно "расшифровывается"?

Проще сделать CREATE DISTINCT TYPE на основе CHAR(6), и написать несколько UDF


Как дети! :) Кто извилистей рукой до уха достанет? Причем чем "проще", тем извилистее. :)

Храните датой и не морочьте себе голову. Никто не гарантирует, что через пару лет точность изменится до полумесяца или до недели. Жизнь -- штука непредсказуемая.

конечно спасибо за совет, но сколько у меня уже гемоггоя было из-за того, что в sybase ASE отсутствует чистый тип DATE, а имеется только DATETIME, (замечу сразу что sybase исправился и в новых версиях ввел тип DATE).
Блин если по какой-то причине (из-за кривых рук например) время попало в такое поле - ни группировку не слалать, ни сравнить толком.
Может по-вашему строгая типизация вообще ненужна? пусть вообще будет один лишь тип CHAR - ведь с его помощью можно все описать...
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652301
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против типизации, но если она вызывает больше проблем чем решнниий - ну ее нафиг. А в данной задачке всё таки лучше пользовать тип DATE. В запросах - выделять год и месяц и сравнивать их
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652326
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman
...sybase ASE отсутствует чистый тип DATE, а имеется только DATETIME,
...(из-за кривых рук например) время попало в такое поле...


У меня на IB6 тоже только DATETIME и работаю с год месяц, но ни какими руками туда ни что до сих пор не попало...

Вопрос только в диапазоне дат... если нужны старые даты (до 1900г) то будут большие проблемы... Тогда лучше хранить их как INTEGER...
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652500
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно создать сущность - месячный календарь и на ее первичный ключ ссылаться. А календарь добавить колонки с числовыми и символьными обозначениями месяцев (какие нужны приложению).
Такое решение сиьльно ограничит возможность появления недостоверных данных.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652679
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sparrowМожно создать сущность - месячный календарь и на ее первичный ключ ссылаться. А календарь добавить колонки с числовыми и символьными обозначениями месяцев (какие нужны приложению).
Такое решение сиьльно ограничит возможность появления недостоверных данных.

Ну чего Вы огород огородите, здесь же форум по проектированию БД, а не по нашождению ноу-хау в области ИТ...
Храните как Date или как DATETIME, они же для этого и сделаны и не надо придумывать как сделать изподвыподверта.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32652994
f2f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f2f
Гость
Именно с точки зрения проектирования sparrow предложил наиболее правильное (IMHO, конечно) решение
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32653617
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как возможное альтернативное решения я бы предложил вам первое число месяца для идентификации месяца. (Использую этот подход с MS SQL совместно с Trigger на Insert и Update).
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32653691
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я в одной базе использую два поля: год и месяц. Запутаннее, если в условиях отбора условия типа "больше-меньше-интервал". Проще при условие на простое равенство определенному месяцу определенного года. Запросы в базе почти все на простое равенство "год-месяц" или "год".
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32653926
Большое спасибо всем, кто участвовал в обсуждении! Я принимал во внимание почти каждый комментарий. В конце-концов, решение о хранении номера месяца отпало само-собой после того, как были написаны и проведены тесты для обоих решений. Решение о хранении номера года и номера месяца в отдельных полях было отвергнуто сразу (извини, Cat2 ). То же самое и для решения о кодировании и расшифровке текстовых строк (извини, gardenman ).

Итак, с датой оказалось работать удобнее, причем без той потери производительности, которой я изначально боялся. Реализация - для Microsoft SQL Server 2000 (была выбрана эта платформа).

P.S. Согласен с f2f : в смысле проектирования sparrow предложил хорошее решение. Но дело в том, что денормализации оно все равно "не выдержит", на мой взгляд.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32657410
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alisher H. AbdurahmanovИтак, с датой оказалось работать удобнее, причем без той потери производительности, которой я изначально боялся. Реализация - для Microsoft SQL Server 2000.


А в полях какого типа вы предполагаете в итоге хранить данные типа "год-месяц" ?
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32658922
В Microsoft SQL Server 2000 есть два типа данных для хранения дат: smalldatetime, datetime. Конечно, я выбрал smalldatetime .
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32673966
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о пользе решения Cat2
1. При общении с клиентом, тип datetime почти самый геморойный.
Обращаясь к серверу с запросом, где необходимо условие для поля типа datetime всегда придется идти по пути, например для VB6 data -> string -> CONVERT(DATETIME,'31/08/04',3)) , причем здесь придется учитывать локальные настройки даты-времени клиента, и использование специфичных для данного сервера функций однозначно привязывает приложение к данному типу сервера
2. Хранимые процедуры, для параметра с типом datetime, в ADO существует Х-тонна вариантов, какой именно подойдет – решать провайдеру для данного типа сервера.
3. Очень часто встречается кривость, например когда требуется сделать условие – отобрать … за год и пишут Year(myFDate)=1234, а то что это не один десяток милионов строк, с учетом того что индексы идут в лес…

ЗЫ и о smalldatetime, я надеюсь ты уже придумал чем это обрабатывать на клиенте, с заданной точностью
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32674410
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2bazaea
--1. При общении с клиентом, тип datetime почти самый геморойный.
может стоит поучится у кого-нибудь ?

--Обращаясь к серверу с запросом, где необходимо условие для поля типа datetime всегда придется идти по пути, например для VB6 data -> string -> CONVERT(DATETIME,'31/08/04',3)) , причем здесь придется учитывать локальные настройки даты-времени клиента, и использование специфичных

пишите '20040803' и никогда локальные настройки не понадобятся

--3. Очень часто встречается кривость, например когда требуется сделать условие – отобрать … за год и пишут Year(myFDate)=1234, а то что это не один десяток милионов строк, с учетом того что индексы идут в лес…

сделайте computing field и постройте по нему индекс и никто в лес не пойдет
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32676859
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik
может стоит поучится у кого-нибудь ?

Да конечно стоит.
Lepsik
пишите '20040803' и никогда локальные настройки не понадобятся

это то же, что CONVERT(DATETIME,'20040101',112)), и так как пока только в ISO стандарте на представление даты нет разделителей, то прокатывает '20040101', но что будет дальше...
Lepsik
сделайте computing field и постройте по нему индекс и никто в лес не пойдет
Значит, всетаки не мытьем так катаньем, поля для года и месяца?

Причем опять повторюсь, что использование в данном случае даты, привяжет вашу систему к одному типу сервера (Как я понял к ms SQL. ), либо породит некое кол-во действий которых можно было бы избежать.
...
Рейтинг: 0 / 0
Дата с точностью до месяца
    #32677656
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazaea
...привяжет вашу систему к одному типу сервера...
От привязки не уйти в любом случае... когда будешь писать процедурки...
У всех по разному... такой уж стандарт... :)

Если хранить ее не как дату, то все равно будут лишние действия с проверкой правильности ввода и отображения...

А те кто пишут: Year(myFDate)=1234, могут при выборке и сдругим типом поля навернуть кучу преобразований...
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дата с точностью до месяца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]