Sql server 2012年3月27日在Varchar到Datetime转换中对SQL Server有意义吗?

Sql server 2012年3月27日在Varchar到Datetime转换中对SQL Server有意义吗?,sql-server,stored-procedures,sql-server-2008-r2,sqlexception,outofrangeexception,Sql Server,Stored Procedures,Sql Server 2008 R2,Sqlexception,Outofrangeexception,我有一个存储过程,它接受作为字符串传入的datetime参数。例如: 程序: CREATE PROCEDURE [dbo].[MyFancySP] @MyStartDate datetime = NULL, @MyEndDate datetime = NULL AS .... 电话: 存储过程一直是这样工作的。现在,这里是有趣的部分。一旦我将日期更改为2012年3月27日或之后,就会出现以下错误:将varchar数据类型转换为datetime数据类型导致值超出范围。 存储过程中使用

我有一个存储过程,它接受作为字符串传入的datetime参数。例如:

程序:

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

存储过程一直是这样工作的。现在,这里是有趣的部分。一旦我将日期更改为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)
在哪里
(@MyStartDate不为空,@MyEndDate不为空

和d.SomeDate>=@MyStartDate和d.SomeDate在每个新的数据库连接上执行以下操作

SET DATEFORMAT DMY
这样做之后,您的问题应该消失了。我怀疑您的问题是由服务器区域设置的组合决定的,以及月13日至31日是否为一天


您不仅看到了错误,还可能在未注意到的情况下获取了错误时段的数据;您的软件的其他层可能正在对此进行更正,但可能仅在某些情况下。

什么类型是
d.SomeDate
?是否有可能是
NVARCHAR
?这可以解释它,因为在这样的c中包含WHERE子句ase是一种隐式转换,表示状态规则应作为
DATETIME
出现。错误的明显随机性是因为查询扫描
d.SomeDate
字段中具有无效日期的行。在这种情况下,您处理的是数据纯度问题,最好修复表通过将列设为DATETIME

此外:

  • 在字符串表示法中始终使用标准日期格式
    yyyymmdd
    (无分隔符):
    EXEC[dbo].[MyFancySP]
    N'20120101',N'20120301';
    。此格式独立于主机区域设置、日期格式和语言设置

  • 阅读。
    其中column=@value或@value为null
    会停止查询性能优化。阅读本文


看起来玛雅人的预测有点晚了,你的服务器使用的是什么排序规则?@ChrisShain服务器排序规则和数据库排序规则是SQL\u Latin1\u General\u CP1\u CI\u AS。我试过了。我仍然收到相同的错误,只是措辞不同。它现在显示“将数据类型nvarchar转换为datetime时出错。”这也是我的想法-服务器期望的是DD/MM/YYYY(欧洲风格)而不是MM/DD/YYYY(美国风格)。我认为这没有意义,否则2012年3月26日也会出错(毕竟没有第26个月),但该日期工作正常。问题只出现在2012年3月27日及以后(包括2012年1月4日等)@Alex-但是,问题中的错误消息措辞与不正确的日期格式相符,而新消息则与之不符,因此我怀疑还有其他原因。我正在尝试复制您现在看到的新消息。您所有的观察结果都来自同一台服务器吗?@Alex-您的新消息似乎来自.NET。您的高级代码需要MDY,然后传入DMY(如我在问题中所看到的)。其中一个必须更改,并且连接应保持在固定的区域性独立设置上。如果确实需要混合格式,请告诉我,我将扩展答案以涵盖该问题。d.SomeDate类型为datetime。
SET DATEFORMAT DMY