从字符串转换日期和/或时间转换失败

时间:2019-01-03 18:52:07

标签: sql-server

declare @orderwhere varchar(5000)
declare @Pdate DateTime

set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate=' + @Pdate

exec('select Product.ProductID
      from Product
      where ' + @orderwhere)

我得到这些错误:

  

第241级第1条第4行第241条消息
  从字符串转换日期和/或时间时转换失败。

3 个答案:

答案 0 :(得分:1)

编辑:

注意:此答案涉及原始问题,该问题有一行DECLARE @Pdate DATETIME = '1001-01-01'和错误消息“从字符串转换日期和/或时间时转换失败。”在里面。


摘自datetime的手册:

  

日期范围[:] 1753年1月1日至9999年12月31日

因此,对于datetime来说,您的一年肯定是早。

您可以尝试使用范围从0001-01-01到9999-12-31的datetime2或仅使用与datetime2相同范围的date日期部分,而不是时间部分)。

答案 1 :(得分:0)

您需要将@Pdate转换为varchar才能进行字符串连接。

set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= '''+ cast(@Pdate as varchar) + ''''

否则,将其视为加法运算。您还需要添加多余的撇号,否则执行失败。这就是为什么在执行之前先进行PRINT调试语句总是很好的原因。

示例:

declare @orderwhere varchar(5000)
declare @Pdate date = '20160101'

set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= ''' + cast(@Pdate as varchar) + ''''

print('select Product.ProductID
from Product
where ' + @orderwhere)

或者,使用datetime

declare @orderwhere varchar(5000)
declare @Pdate datetime = '20160101'

set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= ''' + convert(varchar,@Pdate,120) + ''''

print('select Product.ProductID
from Product
where ' + @orderwhere)

答案 2 :(得分:0)

您必须将@pdate转换为varchar

declare @orderwhere varchar(5000)
declare @Pdate DateTime 
declare @Pdatec varchar(50)
set @Pdatec = CAST(@Pdate as varchar(50))


set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= '''+ @Pdatec + ''''

exec('select Product.ProductID
from Product
where ' + @orderwhere)

并添加引号。 尝试通过打印结果来测试动态查询。