Case in Where 子句使用日期部分

Case in Where Clause using datepart

我使用视图生成受影响的行。 A table t1 有五个列,分别是 Mo、Tu、We、Th 和 Fr。如果这一天不相关,则每一列都有 0,如果这一天相关,则每一列都有 1(例如 1,0,1,0,1 - Mo、We 和 Fr 相关,Tu、Th 不相关)。现在我定义日期实际日期 + 1 并将接收受影响列中具有 1 的所有行。

...
WHERE
CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2)
WHEN 'Mo' THEN t1.Mo = 1
WHEN 'Tu' THEN t1.Tu = 1
... 

但这不起作用。我怎么解决这个问题?

您需要将 case returns 的值与比较分开,这是不同的事情:

WHERE
1 = CASE SUBSTRING(DATEPART(WEEKDAY, GETDATE() + 1), 1, 2)
         WHEN 'Mo' THEN t1.Mo
         WHEN 'Tu' THEN t1.Tu
         -- ...
    END

根据 MSDN,将 WEEKDAY 与 DATEPART 一起使用会 return 一个整数,而不是一个字符串。您需要检查这些整数值,而不是调用子字符串并检查 'Mo'、'Tu'

之类的东西

这是一个简单的例子。另请注意,根据设置(再次查看 MSDN 文章),一周的第一天可能会有所不同。下面我假设第 1 天是星期天。

SELECT CASE DATEPART(WEEKDAY, GETDATE() + 1) 
    WHEN 1 THEN 'Sunday' 
    WHEN 2 THEN 'Monday' 
    ELSE 'Other days' END

带有 WEEKDAY 的 DATEPART 返回一个 INT 值,说明一周内的日期索引。

注意:这取决于系统的文化!看看@@DATEFIRST

不知道你到底想实现什么,但你的代码无法运行。没有带 INT 的 SUBSTRING...

也许是这样的?此查询只会 return 一天中索引为 1 或 2 的内容...

WHERE
1=CASE DATEPART(WEEKDAY, GETDATE() + 1)
WHEN 1 THEN 1
WHEN 2 THEN 1
WHEN 3 THEN 2
END

DATEPART return 一个数字,如果 WEEKDAY 范围(默认)从 1(星期日)到 7(星期六)

WHERE
-- choose the relevant column
CASE DATEPART(WEEKDAY, GETDATE() + 1)
  WHEN 2 THEN t1.Mo
  WHEN 3 THEN t1.Tu
  WHEN 4 THEN t1.We
  WHEN 5 THEN t1.Th
  WHEN 6 THEN t1.Fr
-- compare with the expected value
END = 1