1

也许是一个愚蠢的问题,但我想澄清一下。我创建了一个具有如下日期参数的脚本:

DECLARE @dateparam as datetime
SET @dateparam = '01-01-2013 00:00:00'

即使日期字符串不是“正确”格式,当我对其进行测试时,它看起来也能正常工作yyyy-MM-dd hh:mm:ss。我将计算机区域设置更改为英语,脚本仍然执行它应该做的事情。

这是因为我的计算机中有 SQL Server 2008 R2,它知道如何转换日期,或者我在使用我使用过的日期格式时会遇到问题吗?

4

2 回答 2

3

转换01-01-2013不会暴露诸如哪个01月、哪个月之类的问题。

这不是一种安全的格式。

安全格式(用于转换为datetime,而不是转换为datetime2)是:

YYYYMMDD                               20121201
YYYY-MM-DD'T'hh:mm:ss                  2012-12-01T10:43:29
YYYY-MM-DD'T'hh:mm:ss.mil              2012-12-01T10:43:29.337

坚持那些,只有那些。(示例均代表 2012 年 12 月 1 日)

或者,更好的是,如果可以避免的话,根本不要将日期视为字符串。例如,如果您从 .NET 代码调用 SQL Server,则DateTime在代码中将日期保留为 s,并让 ADO.NET 和 SQL Server 处理任何所需的转换以使它们变为datetimes - 无需将它们相互转换字符串。

于 2012-12-12T07:19:55.050 回答
1

您正在从看起来像日期的东西进行隐式转换,但实际上是一个字符串('01-01-2013 00:00:00')。您应该通过指定格式来明确转换,而不是信任 SQL Server 以正确猜测字符串的格式。

这可以通过使用 CONVERT(不是 CAST)并指定“样式”来完成。此处列出了不同的样式:http: //msdn.microsoft.com/en-us/library/ms187928.aspx

于 2012-12-12T07:42:00.807 回答