我试图对表格中的列进行简单的检查:
If (endDate is null)
use smalldatetime '12/31/2200'
else
use endDate from column
这是我的存储过程:
ALTER PROCEDURE [dbo].[getCostByDate] @date smalldatetime, @productID int
AS
SELECT cost
FROM testDB.dbo.product_cost
WHERE @date between startDate and isNull(endDate,cast('12/31/2200' as smalldatetime)) and product_id = @productID
我试图投出#39; ' 12/31/2200'将它格式化为smalldatetime,但我得到错误:
"将varchar数据类型转换为smalldatetime数据类型会导致超出范围的值。"
答案 0 :(得分:1)
问题是smalldatetime的日期范围是1900-01-01到2079-06-06,并且您的值超过了上限。解决方案是使用范围内的值,或其他日期类型,如datetime或datetime2。
例如, cast('12/31/2078' as smalldatetime)
会起作用。
答案 1 :(得分:0)
这是关键:
and isNull(endDate,cast('2029-04-25T15:50:59.997' as smalldatetime))
你必须给出整个日期,即使它是一个较短的时间...而且,你不能使用2200,我猜它将来太远...