带有dateadd函数/时间函数的SQLError

时间:2016-06-16 15:12:44

标签: sql sql-server

我对SQL很新。我正在使用参数进行查询,以过滤掉6个月前发货的任何对象,并且(在检查其他变量之后)是否在过去21天内发货。如果我将最后一行注释掉,代码将会起作用(我将在下面显示),但是当我取消注释这一行时,代码会给我错误:

  

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

我一直在尝试和研究,但我仍然遇到麻烦。非常感谢您的帮助。代码如下:

where i.status IN ('CR','LB','OB')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime)
and (n.LastShpd IN ('0', '') 
     and (i.OnOrder IN ('0', '') 
     or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2)))

2 个答案:

答案 0 :(得分:1)

这是您的查询:

where i.status IN ('CR','LB','OB')
and i.FGCs > 0
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (n.LastShpd IN ('0', '') -- I'm assuming error occurred in this point
     and (i.OnOrder IN ('0', '') 
     or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2)))

试试这个:

FORMAT (n.LastShpd, 'd', 'en-US' ) in ('0','')

使用FORMAT后,SQL会将该值转换为varchar。然后你可以应用你的字符串条件。

答案 1 :(得分:1)

鉴于在与i.LastShpd比较之前转换为datetime或datetime2,我假设i.LastShpd日期的数据类型相关。因此,我认为使用DATEDIFF代替DATEADD会简化您的查询......

where i.status IN ('CR','LB','OB')
and i.FGCs > 0
and datediff(day, getdate(), i.LastShpd) < -180
and (n.LastShpd IN ('0', '') 
     and (i.OnOrder IN ('0', '') 
     or datdiff(day, getdate(), i.LastShpd) < -21))