我使用视图生成受影响的行。表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
...
但这不起作用。我怎么解决这个问题?
答案 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