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的日期格式并使我的代码生成相同的格式来处理代码?如果是这样,我该怎么做?
答案 0 :(得分:10)
使用标准,明确,语言和区域设置中立格式。如果必须使用字符串,请传递以下格式(我知道您可以使用.ToString()
在.NET中实现):
YYYY-MM-DDTHH:MM:SS
例如:
Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"));
这是首选的原因是,无论您的代码在何处运行,对底层操作系统进行了哪些更改,或者在SQL Server端进行了哪些更改,日期始终是正确的,并且不会被误解了。使用上述格式,您可以永远不必担心,如果出现任何可能发生的各种原因(会话设置,如LANGUAGE
和DATEFORMAT
,区域设置,区域设置,甚至您自己的代码可以对传入的字符串格式做出假设。 SQL Server只有几种真正安全的格式,mm/dd/yyyy
和dd/mm/yyyy
绝对不在其中。
现在,我不确定你为什么要首先使用字符串。最佳实践建议您应该从C#传递datetime参数,而不是字符串文字。没有理由将其转换为字符串。许多人会让用户手动将日期输入到文本框中,然后传递他们输入的内容。不要这样做 - 强制他们从日历控件或一组下拉列表中选择,并从中构建日期时间值。如果您允许用户输入日期,则无法确定某个人的09/07/2013
是否实际上是另一个人的07/09/2013
。
所有这一切,如果您只想输入当前时间,那么让SQL Server提供该值可能会少得多,因为它也具有此功能。因此,例如,如果要将此数据存储在要插入的新行的列中,请将列设置为:
ModifiedDate DATETIME NOT NULL DEFAULT GETUTCDATE()
现在您不必从.NET传递此参数,甚至在INSERT
语句中提及列名。