В SQL Server 2008 какую дату по умолчанию мне следует использовать, если я не хочу, чтобы она была нулевой? - PullRequest
1 голос
/ 07 октября 2009

У меня есть столбцы с типом даты, которые я использую для таких вещей, как созданный, последний измененный и т. Д.

Я не хочу, чтобы в этих столбцах учитывались значения NULL, есть ли лучший метод с точки зрения того, что я должен использовать для их неиспользованного инициализированного состояния?

например. я должен использовать любое значение datetime.minvalue?

Ответы [ 11 ]

10 голосов
/ 07 октября 2009

Вы должны использовать NULL - это то, для чего оно; неизвестные или неинициализированные значения.

Как уже упоминалось в комментариях, нет смысла делать DateCreated обнуляемым. Некоторые люди даже утверждают, что хороший и сильно нормализованный дизайн базы данных вообще не должен принимать нулевые значения - см., Например, эту статью - и я склонен согласиться.

5 голосов
/ 07 октября 2009

Я предпочитаю устанавливать для столбцов значение по умолчанию getDate () или getUTCDate () для таких обстоятельств.

Например, CreatedDate не должно быть NULL, иначе запись теоретически не должна вообще существовать?

Впоследствии, если запись существует, она была создана, и, следовательно, также была изменена, и поэтому дата изменения также может иметь значение по умолчанию getDate ().

Это также подход, который обычно используется для отслеживания изменений записей / строк в хранилище данных.

2 голосов
/ 07 октября 2009

Я не хочу, чтобы в этих столбцах учитывались пустые значения, есть ли лучший метод с точки зрения того, что я должен использовать для их неиспользованного инициализированного состояния?

Поскольку вы не хотите использовать null, вы можете использовать 1 января 1753 0:00:00. Это минимально возможное значение для datetime в SQL Server и вряд ли будет фактическим значением в вашем наборе данных.

Но на самом деле, вы должны использовать null, если можете.

2 голосов
/ 07 октября 2009

Лучше всего использовать NULL, если вы хотите сохранить неиспользованную дату. Когда вы читаете это, вы можете проверить NULL и использовать DateTime.MinValue, если хотите.

1 голос
/ 29 марта 2010

Если лучшая практика действительно то, что вам нужно, используйте NULL ... конец обсуждения. Любой другой выбор - это то, что мы называем не самой лучшей практикой. Как обычно, есть множество не самых лучших практик на выбор. Многие из них упоминаются здесь!

1 голос
/ 07 октября 2009

Я бы не указывал в качестве даты по умолчанию ничего, кроме даты, когда была введена запись (и только в том случае, если это имеет смысл сделать, как в поле date_created). Например, если вы используете данные, которые вряд ли будут использоваться в других данных, во-первых, это неверные данные, которые когда-нибудь будут преследовать вас. Кто-то, кто не знает, что вы сделали такую ​​глупость, когда-нибудь будет искать неполные записи и, конечно, не найдет их, потому что есть дата. Или предположим, что вам нужны записи между начальной и конечной датой и записи о том, где процесс начался, но не закончился. Труднее запросить это с фиктивной датой внутри, чем с нулевым. Предположим, что вы хотите, чтобы записи были более ранними, чем установленная дата, затем вам придется помнить об исключении этих записей, иначе они будут отображаться в вашем наборе записей, то же самое, если вы хотите более поздние записи, если вы используете дату, например 3000/01/01 , Так что это такая же большая работа, как запоминание, чтобы справиться с нулем, может быть в запросе к базе данных только у вас, гораздо меньше шансов сделать это. Поэтому вы чаще будете иметь неправильные результаты для запросов, ориентированных на дату.

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

1 голос
/ 07 октября 2009

Я полностью согласен с NULL/GETDATE() ответами.

Как правило, я бы не стал хранить специальные значения даты и времени где-либо, если вы не готовы регулярно их оборачивать. Потому что вам приходится исправлять логику для добавления порогов, когда DATEDIFF s начинают появляться с разницей в тысячи месяцев и т. Д.

Правило, которое я применяю для дат, никогда не является специальным значением даты и времени NOT NULL (по определению ограничения / таблицы), если нет необходимости для специального зарезервированного значения даты, затем я пытаюсь использовать NULL. Если мне нужно несколько зарезервированных дат, я просматриваю отдельные столбцы флагов с NULL вместо даты и времени или присоединяюсь к измерению даты вместо столбца даты и времени (особенно в хранилищах).

В вашем случае с DateCreated и DateModified, я инициализирую оба к GETDATE() со значениями по умолчанию столбца. DateModified обычно обновляется в триггере UPDATE.

1 голос
/ 07 октября 2009

Неиспользованное, неинициализированное состояние - это именно то, для чего предназначен NULL. Вы должны разрешить NULL там, где это уместно (например, в столбце TERMINATIONDATE, если что-то еще не завершено), и использовать правильные значения, где NULL нет (например, для DATECREATED, когда добавляется строка).

Использование бессмысленных значений для значений NULL вводит пользователей в заблуждение. «Как может быть дата окончания в 2099 году? Мы еще не в 2099 году!» Или «Как может быть дата окончания в 1732 году? Тогда нас не было!»

Неинициализированный означает именно это - неинициализированный. Это не означает «инициализировано, но с поддельным значением».

1 голос
/ 07 октября 2009

Если ваши столбцы действительно Created и LastModified, то почему бы просто не инициализировать их, используя GetDate() (или лучше, GetUtcDate())? Вот как файловые системы инициализируют метки даты и времени вновь создаваемых файлов.

Но, как уже отмечали другие, нет причин бояться null. Если вы действительно имеете в виду «не имеет применимого значения», то кажется, что null - отличный способ выразить это.

1 голос
/ 07 октября 2009

DateTime.MinValue не вписывается в тип данных datetime. Вы можете использовать тип данных datetime2, но, как и другие рекомендуемые, вы должны использовать NULL.

Я часто создаю столбец, такой как LastModified или LastLogin, и он по умолчанию равен нулю.

При нулевом значении быстро сообщите мне, что пользователь никогда не изменял данные и не входил в систему. Значение NULL в этом случае действительно что-то значит.

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