如何在SQL Server中将NULL插入DATETIME列而不是1900-01-01 00:00:00.000

时间:2018-10-16 16:06:47

标签: sql sql-server sql-server-2014

我是SQL Server的新手,我想将日期插入到具有DATETIME作为数据类型的列中。

当我从API向存储过程传递日期时间时,它将插入我已传递的值。但是,如果我传递一个空字符串" ",它将插入默认值1900-01-01 00:00:00.000。但是,如果数据为NULL,我想插入" "

我在Google上搜索了很多,但找不到解决方案。

@DATEVAL1 DATETIME = '',
@DATEVAL1 DATETIME = ''

INSERT INTO TABLE (mDate1, mDate2)
VALUES (@DATEVAL1, @DATEVAL2);

这是我存储过程中的代码。

3 个答案:

答案 0 :(得分:4)

将datetime变量设置为空字符串时,将发生隐式转换。空字符串将隐式转换为1900-01-01。只需声明变量而不给它们赋值或将其显式设置为NULL。

@DATEVAL1 DATETIME,
@DATEVAL2 DATETIME = NULL

或者您可以使用NULLIF。由于您是从API接收这些值的,因此您极有可能必须使用NULLIF。否则,将需要更改API调用以发送NULL而不是空字符串。

Values( NULLIF(@DATEVAL1, '')

答案 1 :(得分:1)

日期和字符串不是同一回事。由于某种原因,SQL Server将空字符串转换为日期值'1900-01-01 00:00:00.000',而不是生成错误。

我的主要建议是不要在日期中使用空字符串。相反,只需使用NULL

DECLARE @DATEVAL1 DATETIME = NULL;
DECLARE @DATEVAL1 DATETIME = NULL;

INSERT INTO TABLE (mDate1, mDate2)
    VALUES (@DATEVAL1, @DATEVAL2);

如果由于某些原因必须使用空字符串,则可以使用触发器将1900的值转换为NULL或在NULLIF()中使用INSERT

INSERT INTO TABLE (mDate1, mDate2)
    VALUES (NULLIF(@DATEVAL1, ''), NULLIF(@DATEVAL2, ''));

答案 2 :(得分:0)

我将和其他两个答案走不同的方向。

我的猜测是您的APP带有一些下拉组合或一些文本字段。您的APP调用您的API,然后将这些值发送到存储过程。有时应用程序发送空字符串,当您将其发送到存储过程时,它们会转换为1900-01-01

因此,如果您具有以下存储过程:

CREATE PROCEDURE dbo.InsertDate 
    @DATEVAL1 DATETIME, @DATEVAL1 DATETIME
AS
    INSERT INTO TABLE (mDate1, mDate2) 
    VALUES (@DATEVAL1, @DATEVAL2);
GO

在这种情况下,如果将''发送到存储过程,则在创建参数时将获得1900-01-01,因为发生了隐式转换,因此NULLIF()在这里不起作用。

您可以在存储过程中添加一些IF ()逻辑,以在运行1900-01-01之前将任何NULL转换为INSERT

或者您可以在调用存储过程之前将逻辑从''转换为NULL到API中。