使用datepart的Where子句中的情况

时间:2015-10-15 08:37:22

标签: sql sql-server select case

我使用视图生成受影响的行。表t1有五列Mo,Tu,We,Th和Fr.如果这一天不相关,则每列为0;如果这一天相关,则每列为0(例如,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
... 

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

4 个答案:

答案 0 :(得分:2)

您需要将case返回的值与比较分开,这是另一回事:

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

答案 1 :(得分:1)

带有WEEKDAY的DATEPART带回一个INT值,在一周内说明当天的指数。

小心:这取决于系统的文化!看看@@ DATEFIRST

不知道你想要实现什么,但你的代码无法正常工作。 INT没有SUBSTRING ...

也许是这样的?此查询仅返回索引为1或2的那天...

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

答案 2 :(得分:1)

DATEPART返回一个数字,如果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

答案 3 :(得分:0)

根据MSDN,使用带有DATEPART的WEEKDAY将返回一个整数,而不是一个字符串。你需要检查那些整数值而不是调用substring并检查像'Mo','Tu'这样的东西

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

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