“将datetime2数据类型转换为smalldatetime数据类型会导致超出范围的值。”

时间:2017-10-30 17:06:03

标签: sql-server date

我有一个存储过程导致日期转换错误。我不知道发生了什么变化,因为它已经好几个月了,但是我们的开发小组是国家DW的下游。有两个变量用于检索日期范围@DatePlus1& @DayOffset

@DatePlus1被用于十几个我不会发帖的CTE,除非被要求但是我注释了日期计算并且难以将日期设置为'2017-10-31 00:00:00'然后运行程序。它运行没有错误,但我不明白为什么。

原始代码将@DatePlus1设置为Date类型,在主题中生成相同的错误。

SELECT @DayOffset = ISNULL(@DayOffset, 0)

DECLARE @DatePlus1 DATETIME2(0)  --Was date but changed to datetime2 while troubleshooting

SELECT
     @DatePlus1 = CONVERT(DATE, DATEADD(dd, 1, DATEADD(dd, @DayOffset, GETDATE())))

1 个答案:

答案 0 :(得分:0)

静态值的解释不会与变量中传递的相同值有任何不同。因此问题不是你想象的那样。

您正在使用范围为smalldatetime数据类型的静态变量进行测试。你的测试成功了。

因此,当您使用变量时测试失败的原因是因为变量的值超出了smalldatetime的范围,或者导致某些选择的值超出范围

问题不在于您使用的是变量。问题是您在代码的某些部分中为该变量赋予了无效值,而这些代码未在您的问题中显示。

要解决此问题,您需要找到代码中填充smalldatetime变量或列的所有位置,并使用PRINTSELECT语句查看您的值试图插入smalldatetime

  

到目前为止,我已经完成了2次,它在1个RequestDate比较中失败但在另一个上没有,但RequestDate出现在不同的表中。

另外要寻找的是代码中的位置,其中变量的值可以通过编程方式进行更改。我会在比较工作的两个查询和失败的查询之间看起来正确。