我是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);
这是我存储过程中的代码。
答案 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中。