where子句中的多个语句,记录超过3周

时间:2013-07-01 17:49:41

标签: sql sql-server where-clause

我的表中有一个名为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的记录。

任何帮助?

2 个答案:

答案 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,在某些情况下这可能是一个有用的默认值。