Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Разрабатываю уровень хранения данных приложения. И вот какое интересное поле потребовалось - дата с точностью до месяца. То есть, по сути, интересует только число года и номер месяца в году. Озадачился способом хранения такого поля. Пока только два "лобовых" варианта на ум приходят: а) хранить как дату, при работе не обращать внимания на день; б) хранить как целое число порядковый номер месяца (за месяц с индексом 1 выбрать какой-либо определенный месяц в прошлом). В первом случае теряю на избыточном хранении и постоянных операциях разбиения дат на составляющие в операциях сравнения. Во втором случае будет присутствовать некоторая "запутанность" в интерпретации данных (не особо страшно, поскольку логика работы с таким полем будет либо реализована в базе, либо вынесена на уровень компонентов доступа к данным). Может быть, уважаемые гуру подадут еще какие-то идеи? Или ссылками на статьи по этой теме поделятся. Буду благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 07:52 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Используйте вариант б. Я его тоже пользую - проблем не заметил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 08:06 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
автор Привет земляк, а зачем надо дату разбивать на составляющие ? Можно ведь числу всегда присваивать 1. А вообще-то формат DATA в разных базах реализована по разному... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 08:17 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
ololПривет земляк, а зачем надо дату разбивать на составляющие? Можно ведь числу всегда присваивать 1. Привет, olol. Можно и единицу присваивать, конечно. Не суть важно, каким будет число в дате, если его все равно предполагается игнорировать. Есть значения дат, хранящихся в столбце. Есть значение даты для выборки нужных записей. В запросе придется пойти одним из двух путей: а) сравнивать значения года и месяца (разбиение даты на составляющие); б) вычислять разницу между датами (использование функции вроде datediff). авторА вообще-то формат DATA в разных базах реализована по разному... Ты хотел сказать о типе Date , а не Data . :) Конкретная реализация на этапе проектирования меня не должна волновать. Достаточно того знания, что во всех современных СУБД есть достаточно функциональности для работы с этим типом данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 08:43 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Use the CREATE TYPE statement to create the specification of an object type ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 08:48 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Alisher H. Abdurahmanov... Есть значение даты для выборки нужных записей. В запросе придется пойти одним из двух путей: а) сравнивать значения года и месяца (разбиение даты на составляющие); б) вычислять разницу между датами (использование функции вроде datediff). Можно попробывать старый способ - хранить дату в виде числа месяцев относительно определенного года. С индексацией вопросов нет, с выборкой тоже. Единственная заморочка для выделения года и месяца придется делить на 12, целую часть прибовлять к "стартовому" году и получать год, а остаток от деления это и будет месяц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 09:16 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
автор а) сравнивать значения года и месяца (разбиение даты на составляющие); Хоть убей не пойму зачем разбивать для сравнения ? Если это выборка данных за один месяц то: SELECT * FROM Table WHERE FieldData = :MyData А если это выборка данных за период то: SELECT * FROM Table WHERE FieldData >= :FirstData AND FieldData <= :LastData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 09:17 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Alisher H. Abdurahmanov б) хранить как целое число порядковый номер месяца (за месяц с индексом 1 выбрать какой-либо определенный месяц в прошлом). А может проще? 200408 - целое число и угадай как оно "расшифровывается"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 09:56 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
проще сделать CREATE DISTINCT TYPE на основе CHAR(6), и написать несколько UDF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 10:01 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
А может проще? 200408 - целое число и угадай как оно "расшифровывается"? Проще сделать CREATE DISTINCT TYPE на основе CHAR(6), и написать несколько UDF Как дети! :) Кто извилистей рукой до уха достанет? Причем чем "проще", тем извилистее. :) Храните датой и не морочьте себе голову. Никто не гарантирует, что через пару лет точность изменится до полумесяца или до недели. Жизнь -- штука непредсказуемая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 10:21 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Николай МВ А может проще? 200408 - целое число и угадай как оно "расшифровывается"? Проще сделать CREATE DISTINCT TYPE на основе CHAR(6), и написать несколько UDF Как дети! :) Кто извилистей рукой до уха достанет? Причем чем "проще", тем извилистее. :) Храните датой и не морочьте себе голову. Никто не гарантирует, что через пару лет точность изменится до полумесяца или до недели. Жизнь -- штука непредсказуемая. конечно спасибо за совет, но сколько у меня уже гемоггоя было из-за того, что в sybase ASE отсутствует чистый тип DATE, а имеется только DATETIME, (замечу сразу что sybase исправился и в новых версиях ввел тип DATE). Блин если по какой-то причине (из-за кривых рук например) время попало в такое поле - ни группировку не слалать, ни сравнить толком. Может по-вашему строгая типизация вообще ненужна? пусть вообще будет один лишь тип CHAR - ведь с его помощью можно все описать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 10:54 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Я не против типизации, но если она вызывает больше проблем чем решнниий - ну ее нафиг. А в данной задачке всё таки лучше пользовать тип DATE. В запросах - выделять год и месяц и сравнивать их ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 11:09 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
gardenman ...sybase ASE отсутствует чистый тип DATE, а имеется только DATETIME, ...(из-за кривых рук например) время попало в такое поле... У меня на IB6 тоже только DATETIME и работаю с год месяц, но ни какими руками туда ни что до сих пор не попало... Вопрос только в диапазоне дат... если нужны старые даты (до 1900г) то будут большие проблемы... Тогда лучше хранить их как INTEGER... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 11:19 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Можно создать сущность - месячный календарь и на ее первичный ключ ссылаться. А календарь добавить колонки с числовыми и символьными обозначениями месяцев (какие нужны приложению). Такое решение сиьльно ограничит возможность появления недостоверных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 12:24 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
sparrowМожно создать сущность - месячный календарь и на ее первичный ключ ссылаться. А календарь добавить колонки с числовыми и символьными обозначениями месяцев (какие нужны приложению). Такое решение сиьльно ограничит возможность появления недостоверных данных. Ну чего Вы огород огородите, здесь же форум по проектированию БД, а не по нашождению ноу-хау в области ИТ... Храните как Date или как DATETIME, они же для этого и сделаны и не надо придумывать как сделать изподвыподверта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 13:09 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Именно с точки зрения проектирования sparrow предложил наиболее правильное (IMHO, конечно) решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 14:52 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Как возможное альтернативное решения я бы предложил вам первое число месяца для идентификации месяца. (Использую этот подход с MS SQL совместно с Trigger на Insert и Update). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 19:25 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Я в одной базе использую два поля: год и месяц. Запутаннее, если в условиях отбора условия типа "больше-меньше-интервал". Проще при условие на простое равенство определенному месяцу определенного года. Запросы в базе почти все на простое равенство "год-месяц" или "год". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 21:16 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Большое спасибо всем, кто участвовал в обсуждении! Я принимал во внимание почти каждый комментарий. В конце-концов, решение о хранении номера месяца отпало само-собой после того, как были написаны и проведены тесты для обоих решений. Решение о хранении номера года и номера месяца в отдельных полях было отвергнуто сразу (извини, Cat2 ). То же самое и для решения о кодировании и расшифровке текстовых строк (извини, gardenman ). Итак, с датой оказалось работать удобнее, причем без той потери производительности, которой я изначально боялся. Реализация - для Microsoft SQL Server 2000 (была выбрана эта платформа). P.S. Согласен с f2f : в смысле проектирования sparrow предложил хорошее решение. Но дело в том, что денормализации оно все равно "не выдержит", на мой взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 09:28 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Alisher H. AbdurahmanovИтак, с датой оказалось работать удобнее, причем без той потери производительности, которой я изначально боялся. Реализация - для Microsoft SQL Server 2000. А в полях какого типа вы предполагаете в итоге хранить данные типа "год-месяц" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 16:59 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
В Microsoft SQL Server 2000 есть два типа данных для хранения дат: smalldatetime, datetime. Конечно, я выбрал smalldatetime . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2004, 13:36 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
о пользе решения Cat2 1. При общении с клиентом, тип datetime почти самый геморойный. Обращаясь к серверу с запросом, где необходимо условие для поля типа datetime всегда придется идти по пути, например для VB6 data -> string -> CONVERT(DATETIME,'31/08/04',3)) , причем здесь придется учитывать локальные настройки даты-времени клиента, и использование специфичных для данного сервера функций однозначно привязывает приложение к данному типу сервера 2. Хранимые процедуры, для параметра с типом datetime, в ADO существует Х-тонна вариантов, какой именно подойдет – решать провайдеру для данного типа сервера. 3. Очень часто встречается кривость, например когда требуется сделать условие – отобрать … за год и пишут Year(myFDate)=1234, а то что это не один десяток милионов строк, с учетом того что индексы идут в лес… ЗЫ и о smalldatetime, я надеюсь ты уже придумал чем это обрабатывать на клиенте, с заданной точностью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2004, 17:25 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
2bazaea --1. При общении с клиентом, тип datetime почти самый геморойный. может стоит поучится у кого-нибудь ? --Обращаясь к серверу с запросом, где необходимо условие для поля типа datetime всегда придется идти по пути, например для VB6 data -> string -> CONVERT(DATETIME,'31/08/04',3)) , причем здесь придется учитывать локальные настройки даты-времени клиента, и использование специфичных пишите '20040803' и никогда локальные настройки не понадобятся --3. Очень часто встречается кривость, например когда требуется сделать условие – отобрать … за год и пишут Year(myFDate)=1234, а то что это не один десяток милионов строк, с учетом того что индексы идут в лес… сделайте computing field и постройте по нему индекс и никто в лес не пойдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2004, 00:47 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
Lepsik может стоит поучится у кого-нибудь ? Да конечно стоит. Lepsik пишите '20040803' и никогда локальные настройки не понадобятся это то же, что CONVERT(DATETIME,'20040101',112)), и так как пока только в ISO стандарте на представление даты нет разделителей, то прокатывает '20040101', но что будет дальше... Lepsik сделайте computing field и постройте по нему индекс и никто в лес не пойдет Значит, всетаки не мытьем так катаньем, поля для года и месяца? Причем опять повторюсь, что использование в данном случае даты, привяжет вашу систему к одному типу сервера (Как я понял к ms SQL. ), либо породит некое кол-во действий которых можно было бы избежать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 11:07 |
|
||
|
Дата с точностью до месяца
|
|||
|---|---|---|---|
|
#18+
bazaea ...привяжет вашу систему к одному типу сервера... От привязки не уйти в любом случае... когда будешь писать процедурки... У всех по разному... такой уж стандарт... :) Если хранить ее не как дату, то все равно будут лишние действия с проверкой правильности ввода и отображения... А те кто пишут: Year(myFDate)=1234, могут при выборке и сдругим типом поля навернуть кучу преобразований... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32652012&tid=1546302]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 261ms |
| total: | 418ms |

| 0 / 0 |
