我对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)))
答案 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))