在插入数据库之前更改日期格式

本文关键字:日期 格式 插入 数据库 | 更新日期: 2023-09-27 18:35:16

我正在将 excel 文件上传到服务器,然后将其行和列插入数据库。我正在逐行做,但我对日期时间有问题。插入 146 行数据后,我收到一个错误,内容如下:

将 varchar 数据类型转换为日期时间数据类型会导致值超出范围。该语句已终止。

问题是日期。在 excel 文件中,日期的格式为 dd/mm/yyyy,但数据库将它们视为 mm/dd/yyyy,因此当日期超过 12 日时,我会出现超出范围的错误。我不想更改我的 excel 文件,所以是否有我可以在数据库(MS SQL 服务器)上更改的选项,或者我是否必须使用 c# 代码,它可以在插入它们之前转换它们......谢谢。。。

在插入数据库之前更改日期格式

如果您知道来自 Excel 的格式,则最好使用特定的 IFormatterProvider 将字符串解析为 C# 中的 DateTime。

这里的问题是来自 Excel 的字符串上没有区域性信息,因此转换为 DateTime 只能考虑数据库的区域性 - 在这种情况下,这是一种颠倒月份和日期的格式。这意味着超出范围的日期(如您的情况)或不明确的日期将永远无法正确解析。

在 C# 代码中,您可以指定实现 IFormatterProvider 的区域性,en-GB 具有您指定的 Excel 日期的日期格式。MSDN 文档中的示例演示如何执行此操作。我的示例简报演示如何将具有 en-GB 日期格式的字符串转换为与区域性无关的DateTime

var culture = CultureInfo.CreateSpecificCulture("en-GB");
var date = DateTime.Parse("13/12/2011", culture);

SQL在文化方面也有同样的问题。任何区分区域性的数据的字符串表示形式将始终丢失当前区域性。转换该数据时,如果区域性与服务器不同,则需要指定区域性。

您可以在 SQL 中执行此操作,并对尝试转换的字符串的格式进行硬编码(103 表示 en-GB 日期格式 dd/mm/yyyy):

declare @datestring varchar(10) = '13/12/2011' --13th December
-- 103 is the format code for UK dates with full yyyy century.
select convert(date, @datestring, 103) --gives 2011-12-13
declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date.
select convert(date, @datestring2, 103) --gives 2011-04-05
转换

/转换格式代码。

还值得注意的是,这也将正确转换不明确的日期,例如 05/04/2011,如果不知道区域性,这将反转月/日。

例如,如果您尝试将英国 2011 年 4 月 5 日转换为美国日期,而没有告诉解析器格式是什么,您将获得 2011 年 5 月 4 日作为输出 - 反转月份和日期。

您可以在使用 T-SQL 插入之前执行此操作:

set dateformat dmy

请参阅 http://msdn.microsoft.com/fr-fr/library/ms189491.aspx

您也可以

在数据库中执行,也可以尝试编写一个存储过程,该过程使用Excelsheet将数据插入数据库。

下面的用户提到了SP中的TSQL代码,这将起作用。

CREATE PROCEDURE ABC
AS
-- Do some operation
    SET DATEFORMAT ydm;
    insert into @dates
    select '2008-09-01','2008-09-01'
END

我认为你必须在 c# 中做到这一点。尝试这样的事情:

String excelDate = ...
String[] dateParts = excelDate.Split('/');
String sqlDate = dateParts[1] + "/" + dateParts[0] + "/" + dateParts[2];
...

首先将 excel datetime 解析为 C# datetime 对象,并格式化 datetime 对象

,例如
DateTime dt = DateTime.Parse(drExcel["dateofExcel"]);
drDB["DateTime"] = dt.ToString("s");

希望它能解决您的问题