SQL Server / TSQL使用isnull转换smalldatetime

时间:2015-01-16 00:36:37

标签: sql-server tsql casting

我试图对表格中的列进行简单的检查:

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数据类型会导致超出范围的值。"

2 个答案:

答案 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,我猜它将来太远...