我的表中有一个名为finished的列,默认为'0'。但是当用户按下按钮时,它会将当前日期更新为白色。在一个视图中,我希望看到的记录为0或比3周更新的日期。
当我使用此代码时:
SET DATEFORMAT DMY
SELECT TOP 100 [ID]
,[week]
,[dayNumb]
,[oven]
,[section]
,[finished]
,convert(datetime, [finished], 104)
,dateadd(week,-3,getdate())
,isdate(convert(datetime, [finished], 104))
FROM [MurergruppeDB].[dbo].[jobPlan]
where [finished] like 0 or convert(datetime, [finished], 104) > dateadd(week,-3,getdate())
我收到错误消息:语法错误从字符串转换datetime。 当我不使用在where子句之后或之后的语句时,我在所有结果中得到了很好的日期时间(当[完成]不像0时),所以我认为服务器正在尝试转换 之前也是0的记录。
任何帮助?
答案 0 :(得分:0)
“0”不是有效日期,因此转换转换(datetime,[finished],104)失败。 SQL Server中没有像C ++ / C#中那样的短路。
我建议使用NULL而不是0.这就是NULL的用途。
然后where子句变为:
where [finished] IS NULL OR convert(datetime, [finished], 104) > dateadd(week,-3,getdate())
CONVERT函数很乐意为[finished]和表达式convert(datetime,[finished],104)>取值为NULL。 dateadd(week,-3,getdate())将评估为False。
答案 1 :(得分:0)
在您的示例中,您最终尝试将“0”转换为日期,“0”不是有效日期。
您需要强制它仅在字段为日期时比较日期:
SET DATEFORMAT DMY
SELECT TOP 100 [ID]
,[week]
,[dayNumb]
,[oven]
,[section]
,[finished]
--,convert(datetime, [finished], 104)
--,dateadd(week,-3,getdate())
--,isdate(convert(datetime, [finished], 104))
FROM [MurergruppeDB].[dbo].[jobPlan]
where [finished] like 0
or CASE WHEN ISDATE([finished]) = 1 THEN convert(datetime, [finished], 104) END
> dateadd(week,-3,getdate())
理想情况下,您不会默认为“0”。 NULL或甚至''在这种情况下都可以工作,因为''作为DATE是1900-01-01
,在某些情况下这可能是一个有用的默认值。