TSQL Минимальная дата и время по умолчанию - PullRequest
21 голосов
/ 05 марта 2009

Используя Transact SQL, существует ли способ указать дату и время по умолчанию для столбца (в операторе создания таблицы), чтобы дата / время были минимально возможным значением для значений даты и времени?

create table atable
(
  atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Modified datetime DEFAULT XXXXX??????
)

Возможно, я должен просто оставить его пустым.

Ответы [ 7 ]

40 голосов
/ 05 марта 2009

Насколько я знаю, не существует никакой функции, чтобы вернуть это, вам придется ее жестко установить.

Попытка привести из значений, таких как 0, чтобы получить минимальную дату, по умолчанию будет 01-01-1900.

Как предлагалось ранее, лучше всего оставить значение NULL (и использовать ISNULL при чтении, если вам нужно), или, если вы беспокоитесь о его правильной настройке, вы можете даже установить триггер на таблице, чтобы установить дату изменения изменений.

Если ваше сердце настроено на получение минимально возможной даты, то:

create table atable
(
  atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Modified datetime DEFAULT '1753-01-01'
)

16 голосов
/ 07 марта 2011

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

За настройку столбцов необходимо заплатить цену: NULL не индексируются. Запрос типа «получить все записи, которые не были изменены с начала 2010 года», включает в себя те, которые никогда не были изменены. Если мы используем столбец со значением NULL, то мы вынуждены использовать [Modified] <@cutoffDate OR [Modified] <strong>IS NULL , и это, в свою очередь, заставляет ядро ​​базы данных выполнять сканирование таблицы, поскольку нулевые значения не индексируется. И этот последний может быть проблемой.

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

Короче говоря, по умолчанию / правилу большого пальца следует перейти на NULL. Но если существует огромное количество записей, данные часто запрашиваются, и только небольшая часть записей имеет значение NULL / специальное, это может привести к значительному увеличению производительности для поиска записей на основе этой информации (при условии, что один создает index!) и ИМХО это может время от времени оправдывать использование «магических» значений.

10 голосов
/ 05 марта 2009

«Возможно, я должен оставить это ноль»

Не используйте магические числа - это плохая практика - если у вас нет значения, оставьте его пустым

В противном случае, если вам действительно нужна дата по умолчанию - используйте один из других методов, опубликованных для установки даты по умолчанию

5 голосов
/ 10 августа 2010

Если вы не используете БД для отслеживания исторических времен более века назад, используя

Modified datetime DEFAULT ((0)) 

абсолютно безопасен и надежен и позволяет выполнять более элегантные запросы, чем «1753-01-01», и более эффективные запросы, чем NULL.

Тем не менее, поскольку первым измененным datetime является время, когда была вставлена ​​запись, вы можете использовать:

Modified datetime NOT NULL DEFAULT (GETUTCDATE())

, который устраняет всю проблему и делает ваши вставки более простыми и безопасными - поскольку вы вообще не вставляете их, а SQL выполняет работу по дому :-)

Имея это в виду, вы можете по-прежнему иметь элегантные и быстрые запросы, используя 0 в качестве практического минимума, поскольку гарантируется, что он всегда будет ниже, чем любой генерируемый вставкой GETUTCDATE().

3 голосов
/ 22 октября 2011

Иногда вы наследуете хрупкий код, который уже ожидает магические значения во многих местах. Все правильно, вы должны использовать NULL, если это возможно. Тем не менее, в качестве ярлыка, чтобы убедиться, что все ссылки на это значение одинаковы, мне нравится помещать «константы» (из-за отсутствия лучшего имени) в SQL в функцию масштабирования, а затем вызывать эту функцию, когда мне нужно значение. Таким образом, если я когда-нибудь захочу обновить их, чтобы они стали чем-то другим, я могу сделать это легко. Или, если я хочу изменить значение по умолчанию в будущем, у меня есть только одно место для его обновления.

Следующий код создает функцию и таблицу, используя ее для значения DateTime по умолчанию. Затем вставляет и выбирает из таблицы, не указывая значение для Modified. Затем убирает за собой. Надеюсь, это поможет.

-- CREATE FUNCTION
CREATE FUNCTION dbo.DateTime_MinValue ( )
RETURNS DATETIME
AS 
    BEGIN
        DECLARE @dateTime_min DATETIME ;
        SET @dateTime_min = '1/1/1753 12:00:00 AM'
        RETURN @dateTime_min ;
    END ;
GO


-- CREATE TABLE USING FUNCTION FOR DEFAULT
CREATE TABLE TestTable
(
  TestTableId INT IDENTITY(1, 1)
                  PRIMARY KEY CLUSTERED ,
  Value VARCHAR(50) ,
  Modified DATETIME DEFAULT dbo.DateTime_MinValue()
) ;


-- INSERT VALUE INTO TABLE
INSERT  INTO TestTable
        ( Value )
VALUES  ( 'Value' ) ;


-- SELECT FROM TABLE
SELECT  TestTableId ,
        VALUE ,
        Modified
FROM    TestTable ;


-- CLEANUP YOUR DB
DROP TABLE TestTable ;
DROP FUNCTION dbo.DateTime_MinValue ;
0 голосов
/ 05 марта 2009

Я думаю, что ваш единственный вариант здесь константа. С учетом сказанного - не используйте его - придерживайтесь пустых значений вместо фиктивных.

create table atable
(
  atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Modified datetime DEFAULT '1/1/1753'
)
0 голосов
/ 05 марта 2009

Я думаю, что это будет работать ...

create table atable
(
  atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Modified datetime DEFAULT ((0))
)

Редактировать: Это неправильно ... Минимальное значение SQL DateTime составляет 1/1/1753. Мое решение предусматривает дату и время = 01.01.1900 00:00:00. Другие ответы имеют правильную минимальную дату ...

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