SQL Server日期数据类型default和constraints

时间:2016-09-21 02:56:16

标签: sql sql-server sql-server-2008

我在使用SQL Server时遇到一些困难,我正在创建一个名为GUEST的表并使用date作为数据类型,而不是null,并且默认值为'today'且约束为日期必须等于或晚于2010年12月1日。

但是,当我尝试通过插入具有默认值的行进行测试时遇到问题。

如何让SQL Server显示当前日期而不是默认为{00}的默认getDate(),其默认值为1900-01-01,其与我的约束条件的日期冲突必须晚于01 -dec-2010

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

导致错误:

  

INSERT语句与CHECK约束“chk_DATEJOINED”冲突。冲突发生在表“dbo.GUEST”,列'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))
)

5 个答案:

答案 0 :(得分:1)

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

所以你的insert语句试图隐式插入的是1900-01-01,因为你传递了值''。如果您希望插入使用默认值,则必须将其完全排除。

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

会做的伎俩

答案 1 :(得分:0)

如果您想尝试默认值,则无需将值传递给日期字段。 ' '是一个有效的字符串字符,它变成了1900-01-01'转换为日期类型时。在插入查询时也会提到列名称,如下所示。如果您没有在INSERT语句中提及列名,SQL Server将尝试以默认的列顺序插入数据。

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

答案 2 :(得分:0)

你应该使用这个

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

您的查询等于INSERT INTO EMPLOYEE VALUES('John' , CAST('' as datetime))

当您使用查询INSERT INTO EMPLOYEE VALUES('John' ,''); SQLServer时,会尝试将''转换为数据时间,即1900-01-01,这样您就会收到该错误。

答案 3 :(得分:0)

这可以通过多种方式完成。

1)像其他人一样指出。说明要填充哪些列并跳过dateJoined列。

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

2)使用default关键字作为值。

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

如果要在代码中构建SQL语句并希望显式设置列列表,则default关键字很有用。如果列上没有默认约束,则默认关键字默认为null,因此请注意声明为非null的列。

答案 4 :(得分:0)

尝试这个插入语句。     插入#EMPLOYEE(姓名)      价值观('约翰');