2016-09-21 6 views
1

У меня возникают трудности с SQL Server, где я создаю таблицу с именем GUEST и используя date как тип данных, а не null и имеет значение по умолчанию 'today' и ограничение по умолчанию дата должна быть равна или позже 01 декабря 2010 года.Значение даты и ограничения даты и времени SQL Server

Однако при попытке тестирования я столкнулся с проблемой, вставив строку со значениями по умолчанию.

Как я могу позволить SQL Server, чтобы показать текущую дату, а не по умолчанию getDate() в который по умолчанию 1900-01-01, противоречащего моим ограничением состояния даты должны быть позже, чем 01 -дек-2010

INSERT INTO GUEST 
VALUES('John' ,''); 

приводит к ошибке:

The INSERT statement conflicted with the CHECK constraint "chk_DATEJOINED". The conflict occurred table "dbo.GUEST", column 'dateJoined'.

я сделал некоторый код, чтобы показать

CREATE TABLE GUEST 
(
    [...] 
    guestNum int NOT NULL IDENTITY(5,1), 
    name varchar(40) NOT NULL, 
    dateJoined date NOT NULL DEFAULT GETDATE() 
    [...] 

    CONSTRAINT chk_DATEJOINED 
     CHECK (dateJoined >= CAST('01-dec-2010' as DATETIME)) 
) 

ответ

0

Это можно сделать несколькими способами.

1) как и все остальные указал. Укажите, какие столбцы вы хотите заполнить и пропустить столбец dateJoined.

insert into Employee (name) values ('John') 

2) Используйте ключевое слово по умолчанию в качестве значения.

insert into Employee (name, dateJoined) values ('John', default) 

Ключевое слово по умолчанию полезно, если вы создаете инструкцию SQL в коде и хотите, чтобы список столбцов был явно установлен. Default default defaults равно null, если в столбце нет ограничения по умолчанию, поэтому обратите внимание на столбцы, объявленные как не равные нулю.

0

Если вы хотите попробовать значение по умолчанию, не нужно передавать значение в поле даты. '' является допустимым строковым символом, и он становится «1900-01-01» при преобразовании в тип даты. Также укажите имена столбцов в запросе «Вставка», вставив вставку, как показано ниже. Если вы не укажете имена столбцов в инструкции INSERT, SQL-сервер попытается вставить данные в порядок столбцов по умолчанию.

INSERT INTO Employee (name, ..OtherColumns) --mention the name of other columns if required 
    VALUES ('John',OtherColumnsValues) 
+0

Привет, я использовал ('') для проверки значения по умолчанию, и он показывает 1900-01-01, который конфликтует с моим условием ограничения даты, должен быть более чем 01 -dec-2010 – jukira

+0

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

0

Вы должны использовать этот

INSERT INTO EMPLOYEE_test(name) VALUES('John'); 

Ваш запрос, равный INSERT INTO EMPLOYEE VALUES('John' , CAST('' as datetime))

При использовании запроса INSERT INTO EMPLOYEE VALUES('John' ,'');SQLServer будет пытаться конвертировать '' в datatime, и это 1900-01-01 так что вы получите эту ошибку ,

+0

Привет, я использовал ('') для проверки значения по умолчанию, и он показывает 1900-01-01, который конфликтует с моим условием ограничения даты, должен быть позже 01 -dec-2010. – jukira

+0

@jukira '' не является значением по умолчанию. Это значение NULL, и оно равно 'cast ('' как datetime)' - равно '1900-01-01'. –

1
SELECT CAST('' as DATE) returns 1900-01-01; 

Так что ваш оператор insert пытается вставить неявно 1900-01-01, поскольку вы передали значение ''. Если вы хотите, чтобы вставка использовала значение по умолчанию, вы должны полностью исключить его.

INSERT INTO EMPLOYEE(Name) VALUES('John'); 

будет делать трюк

0

попробуйте эту инструкцию для вставки. INSERT INTO #EMPLOYEE (имя) VALUES ('John');

Смежные вопросы