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
我使用视图生成受影响的行。 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