向SQL Server插入任何日期时间格式字符串的标准方法

本文关键字:字符串 格式 标准 方法 时间 日期 SQL Server 插入 任何 | 更新日期: 2023-09-27 18:03:39

我正在从Excel文件导入数据到SQL Server。我的工作表包含一些日期和时间列。如果它包含'M/d/yyyy'(12/31/2015)格式的值,这是我的系统日期时间格式,它执行顺利,没有任何错误。但如果值不是'M/d/yyyy'格式,则不会插入数据并给出异常。

我甚至没有转换日期时间值到特定的格式,然后插入,简单地拿起数据插入到SQL Server。我不明白问题到底是什么,它与系统日期时间格式有什么关系。

我使用的代码是:

select case when ISDATE(@SignalDateTime)=1 then @SignalDateTime else null end
我得到的错误是:

将varchar数据类型转换为日期时间数据类型导致值超出范围

如果日期是'12/21/2015'格式,它是好的,但对于任何其他格式,它给出错误。

向SQL Server插入任何日期时间格式字符串的标准方法

使用参数化查询,并设置参数类型为Datetime:

SqlCommand cmd = new SqlCommand(
      "INSERT INTO ... (..., datetimecolumn, ...) VALUES (..,@datetimeparameter,...", 
       connection);
SqlParameter datetimeParameter = new SqlParameter(
      "@datetimeparameter", 
       SqlDbType.Datetime);
datetimeParameter.Value = <your C# variable of type Date>;
...
cmd.ExecuteNonQuery();

使用像实体框架这样的框架可以处理大量的样板代码。

使用SqlBulkCopy是另一种可行的方法。

不能工作的原因是在T-SQL中将值作为硬编码字符串传递。除了SQL注入倾向,缓慢和不性能,有无数的问题围绕客户端(应用程序)区域设置,服务器区域设置和SQL server区域设置(SET DATEFORMAT)的组合。请注意:SQL Server中有一个独立于地区的日期时间格式,即YYYYMMDD hh:mm:ss格式。当必须使用T-SQL字符串来表示日期时,请使用该格式,因为它与地区无关。

此外,您可能还想了解一些关于SSIS的知识,因为它可以实现您想要的开箱操作(有一个SSIS Excel源代码)。

我没有测试,所以我不是100%确定。你可以改变你的列datetime2(7)数据库?然后以YYYY-MM-DD hh:mm:ss的格式发送日期时间。我建议,因为datetime2作为上述格式的默认字符串文字,而datetime没有它,所以它是基于系统文化的。我建议,因为Datetime2有默认的文字字符串,而DateTime没有它,你可以点击MSDN网站来了解更多关于它的信息

Excel内部将日期时间存储为数字。因此,您可能需要将其读取为数字,并将其"手动"转换,然后将其存储在SQL