如何在 SQL 服务器中将 NULL 插入 DATETIME 库而不是 1900-01-01 00:00:00.000
How to insert NULL into the DATETIME coulmn instead 1900-01-01 00:00:00.000 in SQL Server
我是 SQL 服务器的新手 我正在尝试将日期插入数据类型为 DATETIME
的列中。
当我将日期时间从 API 传递给存储过程时,它会插入我传递的值。但是如果我传递一个空字符串 " "
,它会插入一个默认值 1900-01-01 00:00:00.000
。但是如果数据是 " "
.
我想插入 NULL
我用谷歌搜索了很多,但找不到解决方案。
@DATEVAL1 DATETIME = '',
@DATEVAL1 DATETIME = ''
INSERT INTO TABLE (mDate1, mDate2)
VALUES (@DATEVAL1, @DATEVAL2);
这是我存储过程中的代码。
当您将日期时间变量设置为空字符串时,会发生隐式转换。空字符串隐式转换为 1900-01-01。要么只声明变量而不给它们赋值,要么显式地将它们设置为 NULL。
@DATEVAL1 DATETIME,
@DATEVAL2 DATETIME = NULL
或者您可以使用 NULLIF。由于您从 API 接收这些值,因此您很可能必须使用 NULLIF。否则,需要更改 API 调用以发送 NULL 而不是空字符串。
Values( NULLIF(@DATEVAL1, '')
日期和字符串不是一回事。出于某种原因,SQL 服务器将空字符串转换为日期值 '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
或在 INSERT
中使用 NULLIF()
:
INSERT INTO TABLE (mDate1, mDate2)
VALUES (NULLIF(@DATEVAL1, ''), NULLIF(@DATEVAL2, ''));
我将继续与其他两个答案不同的方向。
我猜你有一个带有一些下拉组合或一些文本字段的应用程序。您的 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
或者您可以在 API 中添加逻辑,在调用存储过程之前将任何 ''
转换为 NULL
。
我是 SQL 服务器的新手 我正在尝试将日期插入数据类型为 DATETIME
的列中。
当我将日期时间从 API 传递给存储过程时,它会插入我传递的值。但是如果我传递一个空字符串 " "
,它会插入一个默认值 1900-01-01 00:00:00.000
。但是如果数据是 " "
.
NULL
我用谷歌搜索了很多,但找不到解决方案。
@DATEVAL1 DATETIME = '',
@DATEVAL1 DATETIME = ''
INSERT INTO TABLE (mDate1, mDate2)
VALUES (@DATEVAL1, @DATEVAL2);
这是我存储过程中的代码。
当您将日期时间变量设置为空字符串时,会发生隐式转换。空字符串隐式转换为 1900-01-01。要么只声明变量而不给它们赋值,要么显式地将它们设置为 NULL。
@DATEVAL1 DATETIME,
@DATEVAL2 DATETIME = NULL
或者您可以使用 NULLIF。由于您从 API 接收这些值,因此您很可能必须使用 NULLIF。否则,需要更改 API 调用以发送 NULL 而不是空字符串。
Values( NULLIF(@DATEVAL1, '')
日期和字符串不是一回事。出于某种原因,SQL 服务器将空字符串转换为日期值 '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
或在 INSERT
中使用 NULLIF()
:
INSERT INTO TABLE (mDate1, mDate2)
VALUES (NULLIF(@DATEVAL1, ''), NULLIF(@DATEVAL2, ''));
我将继续与其他两个答案不同的方向。
我猜你有一个带有一些下拉组合或一些文本字段的应用程序。您的 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
或者您可以在 API 中添加逻辑,在调用存储过程之前将任何 ''
转换为 NULL
。