DateTime格式与SQL Server中的格式不匹配

时间:2012-02-23 02:49:07

标签: .net sql-server datetime

DateTime.UtcNow.ToString()的格式为 - DD/MM/YYYY HH:MM:SS

SQL Server Express期望的格式是 - YYYY/MM/DD HH:MM:SS

(SqlDateTime)DateTime.UtcNow的格式为 - DD/MM/YYYY HH:MM:SS

据我所知,两者都是英国格式。我在英国,在同一台机器上运行代码和SQL Server Express。

我知道我可以在ToString()方法中指定格式,但这不能解决根本问题。为什么SQL Server Express在同一台机器上运行时需要不同的格式?

解决这种不匹配的最佳方法是什么,以便在我发布到服务器时也可以使用(可能没有这个问题)?

我应该在我的机器上同步日期格式,并假设我发布时一切正常吗?如果是这样,我该怎么做?或者我应该通过某种方式检测SQL Server Express的日期格式并使我的代码生成相同的格式来处理代码?如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:10)

使用标准,明确,语言和区域设置中立格式。如果必须使用字符串,请传递以下格式(我知道您可以使用.ToString()在.NET中实现):

YYYY-MM-DDTHH:MM:SS

例如:

Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"));

这是首选的原因是,无论您的代码在何处运行,对底层操作系统进行了哪些更改,或者在SQL Server端进行了哪些更改,日期始终是正确的,并且不会被误解了。使用上述格式,您可以永远不必担心,如果出现任何可能发生的各种原因(会话设置,如LANGUAGEDATEFORMAT,区域设置,区域设置,甚至您自己的代码可以对传入的字符串格式做出假设。 SQL Server只有几种真正安全的格式,mm/dd/yyyydd/mm/yyyy绝对不在其中。

现在,我不确定你为什么要首先使用字符串。最佳实践建议您应该从C#传递datetime参数,而不是字符串文字。没有理由将其转换为字符串。许多人会让用户手动将日期输入到文本框中,然后传递他们输入的内容。不要这样做 - 强制他们从日历控件或一组下拉列表中选择,并从中构建日期时间值。如果您允许用户输入日期,则无法确定某个人的09/07/2013是否实际上是另一个人的07/09/2013

所有这一切,如果您只想输入当前时间,那么让SQL Server提供该值可能会少得多,因为它也具有此功能。因此,例如,如果要将此数据存储在要插入的新行的列中,请将列设置为:

ModifiedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

现在您不必从.NET传递此参数,甚至在INSERT语句中提及列名。