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

时间:2012-05-24 09:41:58

标签: c# sql sql-server database

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

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

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

5 个答案:

答案 0 :(得分:2)

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

这里的问题是没有来自Excel的字符串的文化信息,因此转换为DateTime只能考虑数据库的文化 - 在这种情况下是一种反转月和日的格式。这意味着范围之外的日期(如您的情况)或模糊日期将永远无法正确解析。

在C#代码中,您可以指定实现IFormatterProvider的区域性,en-GB具有您指定的Excel日期的日期格式。 MSDN documentation中的示例显示了如何执行此操作。我的示例简报显示了如何将具有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

Convert / cast format codes.

同样值得注意的是,这也将正确转换模糊日期,例如05/04/2011,如果文化不为人所知,这将会扭转月/日。

例如,如果您试图将2011年4月5日英国转换为美国日期而不告诉解析器格式是什么,您将在2011年5月4日作为输出 - 扭转月和日。

答案 1 :(得分:0)

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

set dateformat dmy

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

答案 2 :(得分:0)

首先将您的Excel日期时间解析为C#datetime对象并格式化datetime对象,如我们所说

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

希望它能解决你的问题

答案 3 :(得分:0)

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

用户下面提到的SP中的TSQL代码可以使用。

CREATE PROCEDURE ABC
AS
-- Do some operation
    SET DATEFORMAT ydm;

    insert into @dates
    select '2008-09-01','2008-09-01'

END

答案 4 :(得分:0)

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

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