首页 > 解决方案 > SQL 无法在列中插入转换后的日期时间

问题描述

我很困惑为什么当它的输出相同时我无法将转换后的日期值插入到我的表列中。

错误:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:从字符串转换日期和/或时间时转换失败

成功(硬编码日期时间):

cmd.CommandText = @"INSERT INTO [TestDB].[Cat1].[Table1] (CreatedOn) 
                    VALUES ('2019-08-22 23:59:59.000')";

失败(转换的日期时间):

cmd.CommandText = @"INSERT INTO [TestDB].[Cat1].[Table1] (CreatedOn) 
                    VALUES ('@CreatedOn')";

//value below has the same output as above (2019-08-22 23:59:59.000)
cmd.Parameters.AddWithValue("@CreatedOn", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

//below failed too
cmd.Parameters.AddWithValue("@CreatedOn", DateTime.Now);

列类型:

在此处输入图像描述

标签: sqlsql-serverdatetimecommand-text

解决方案


该值'2019-08-22 23:59:59.000'与数据类型明确datetime(它与新的日期和时间数据类型有关)。例如,如果您是英国人,则以下内容将失败:

SET LANGUAGE BRITISH;
SELECT CONVERT(datetime,'2019-08-22 23:59:59.000');

这是因为 SQL Server 以 格式读取日期yyyy-dd-MM,而一年中没有 22 个月。如前所述,它适用于较新的数据类型,或者如果您是美国人(但您应该编写与语言无关的代码):

SET LANGUAGE BRITISH; --English
SELECT CONVERT(datetime2(3),'2019-08-22 23:59:59.000');
SELECT CONVERT(datetimeoffset(0),'2019-08-22 23:59:59.000');

SET LANGUAGE ENGLISH; --American. Confusing, right? :)
SELECT CONVERT(datetime,'2019-08-22 23:59:59.000');

一种方法是使用不受数据类型或语言影响的明确格式:

SET LANGUAGE BRITISH;
SELECT CONVERT(datetime,'2019-08-22T23:59:59.000');

否则,您可以告诉 SQL Server 值的样式(在本例中121):

SET LANGUAGE BRITISH;
SELECT CONVERT(datetime,'2019-08-22 23:59:59.000',121);

推荐阅读