【问题标题】:SQL Server 2012 - Case statement in where clauseSQL Server 2012 - where 子句中的 case 语句
【发布时间】:2013-06-30 17:47:01
【问题描述】:

SQL 不是我的强项,但我不知道为什么它不起作用。我只是想根据一个值运行不同的 AND 语句。具体来说,如果 foo 为 = 0

,我想更改 dateDiff 函数中的 datePart
SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1,
CASE WHEN foo = 0
        AND dateDiff(dd, getDate(), 2 ) < test
ELSE
        AND dateDiff(hh, getDate(), 2 ) < test
END

【问题讨论】:

  • 您的查询中有语法错误
  • 我不知道为什么,但这是人们在 SQL 中常犯的错误——他们引入了 CASE 表达式,而实际上,他们真正需要的只是基本的逻辑运算符。
  • 达米恩,想推断一下吗?
  • 正如德瓦特的回答,你只需要说(foo = 0 AND DATEDIFF(dd,...) OR foo!=0 AND DATEDIFF(hh,...))
  • 虽然现在我来看看它,但我相当肯定,无论你的目标是什么,那些DATEDIFF 调用并没有像你想象的那样做。提示:DATEDIFF 返回一个整数,它(如果与datetime 比较)将隐式转换为datetime,作为自1900-01-01 以来的天数。而DATEDIFF的第三个参数是一个日期,2会隐式转换为1900-01-03

标签: sql sql-server sql-server-2012 case where


【解决方案1】:

如果我不得不猜测您的实际目标,那就是您想从 GETDATE() 中减去 2 小时或几天以用于比较。

这就是我认为你的目标:

SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1 AND
(
   (foo = 0 AND DATEADD(day,-2, GETDATE()) < test)
   OR
   (foo<>0 AND DATEADD(hour,-2,GETDATE()) < test)
)

我不认为你真的想要那些DATEDIFF 电话。例如,今天(2013 年 7 月 3 日),这个表达式:

select CAST(DATEDIFF(dd,getdate(),2) as datetime)

产生1786-07-031。我假设 testdatetime 并且正在执行隐式转换。即使不是,DATEDIFF(dd,getdate(),2) 的数值也将始终是一个很大的负数(除非或直到它运行在 GETDATE() 返回 20 世纪之前的值的机器上)


1 奇怪的是,我认为 7 月 3 日是一年中唯一一个结果将具有相同月份和日期的日子。

【讨论】:

  • 对不起 Damien,我最初的例子是错误的。我正在比较 2 个日期而不是 int 作为第三个参数。感谢您的彻底跟进!
【解决方案2】:

你可以这样试试

SELECT foo,
       bar,
       test
FROM table
WHERE bar = 1 And
(CASE WHEN foo = 0
    then   dateDiff(dd, getDate(), 2 )
ELSE
       dateDiff(hh, getDate(), 2 ) 
END)<test

【讨论】:

  • Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'AND'.
【解决方案3】:

试试这个 -

SELECT foo,
       bar,
       test
FROM [table]
WHERE bar = 1
    AND (
            (
                foo = 0 
                AND 
                DATEDIFF(dd, GETDATE(), 2 ) < test
            )
        OR  
            DATEDIFF(hh, GETDATE(), 2 ) < test
        )

【讨论】:

  • 不遵循这个.. 如果 foo = 0 则只使用 DD 的情况是什么
  • 这是等号表达式。为什么需要CASE
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多