0

我的表中有一个名为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())

我收到错误消息:从字符串转换日期时间的语法错误。当我不在 where 子句之后或中使用语句时,我会在所有结果中得到很好的日期时间(当 [finished] 不像 0 时),所以我认为服务器正在尝试转换之前为 0 的记录。

有什么帮助吗?

4

2 回答 2

0

“0”不是有效日期,因此转换 convert(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] 设为 NULL,表达式 convert(datetime, [finished], 104) > dateadd(week,-3,getdate()) 将评估为 False。

于 2013-07-01T17:57:45.140 回答
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 甚至 '' 都可以使用,因为 '' 作为 DATE1900-01-01在某些情况下可能是有用的默认值。

于 2013-07-01T18:01:06.963 回答