【问题标题】:Is March 27th, 2012 of significance to SQL Server in a Varchar to Datetime conversion?2012 年 3 月 27 日对 SQL Server 在 Varchar 到 Datetime 的转换中是否重要?
【发布时间】:2012-04-19 16:19:30
【问题描述】:

我有一个存储过程,它接受一个作为字符串传入的日期时间参数。比如这样:

程序:

CREATE PROCEDURE [dbo].[MyFancySP]
   @MyStartDate datetime = NULL,
   @MyEndDate datetime = NULL
AS
....

呼叫:

EXEC [dbo].[MyFancySP]
   @MyStartDate = N'01/01/2012',
   @MyEndDate = N'03/01/2012'

存储过程一直这样工作。现在,这是有趣的部分。一旦我将日期更改为 2012 年 3 月 27 日或过去,我就会收到以下错误:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。强>

存储过程中唯一使用日期的地方是 where 子句。如果和它有关,我也将它复制到这里:

WHERE
((@MyStartDate IS NOT NULL AND @MyEndDate IS NOT NULL 
AND d.SomeDate >= @MyStartDate AND d.SomeDate <= @MyEndDate) 
OR @MyStartDate IS NULL AND @MyEndDate IS NULL)

知道为什么我会在 3 月 27 日或之后收到超出范围的异常吗?顺便说一下,这是在 SQL Server 2008 R2 上运行的。

谢谢!

【问题讨论】:

标签: sql-server stored-procedures sql-server-2008-r2 sqlexception outofrangeexception


【解决方案1】:

在每个新的数据库连接上执行以下操作。

SET DATEFORMAT DMY

执行此操作后,您的问题应该会消失。我怀疑您的问题是由服务器区域设置以及日期是否为 13 日到 31 日的组合所决定的。

您不仅会看到错误,还可能会在不注意的情况下获取错误期间的数据;您的软件的其他层可能会对此进行纠正,但可能只是在某些情况下。

【讨论】:

  • 我试过这个。我仍然遇到同样的错误,只是措辞不同。它现在说“将数据类型 nvarchar 转换为日期时间时出错。”
  • 这也是我的想法——服务器期待 DD/MM/YYYY(欧洲风格)而不是 MM/DD/YYYY(美国风格)
  • 我认为这没有意义,否则 03/26/2012 也会出错(毕竟没有第 26 个月),但该日期可以正常工作。该问题仅出现在 03/27/2012 及以后(包括 04/01/2012 等)。
  • @Alex - 但是,问题中的错误消息措辞适合不正确的 DATEFORMAT 而新的不适合,所以我怀疑还有其他问题。我正在尝试重现您现在看到的新版本。您的所有观察结果都来自同一台服务器吗?
  • @Alex - 您的新消息似乎来自 .NET。似乎您的更高级别代码需要 MDY,并且您传入 DMY(正如我在问题中看到的那样)。一个或另一个必须改变,并且应该在固定的文化独立环境中保持联系。如果您确实需要混合格式,请告诉我,我会扩展答案以涵盖这一点。
【解决方案2】:

d.SomeDate 是什么类型?是NVARCHAR吗?这可以解释它,因为在这种情况下,WHERE 子句将包含一个隐式转换,即Data Type Precedence 的规则状态应该作为DATETIME 出现。由于查询扫描了d.SomeDate 字段中具有无效日期的行这一简单事实,因此会出现明显的错误随机性。在这种情况下,您正在处理数据纯度问题,您应该修复您的表,最好将列设为 DATETIME。

另外:

  • 在字符串表示中始终使用规范的日期格式 YYYYMMMDD(无分隔符):EXEC [dbo].[MyFancySP] N'20120101', N'20120301';。此格式与主机区域设置、DATEFORMAT 和 LANGUAGE 设置无关。

  • 阅读Dynamic Search Conditions in T-SQLWHERE column=@value or @value is null 停止查询性能优化。阅读文章。

【讨论】:

  • d.SomeDate 是日期时间类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2020-12-23
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多