我在数据库中存储了一个整数(SQLAgent 频率间隔)这个整数实际上是计划运行的一周中选定天数的总和 可能的值是这些值的任意组合
- 星期日 =1
- 星期一 = 2
- 星期二 =4
- 星期三= 8
- 星期四 = 16
- 星期五 = 32
- 星期六 =64
ex 65 表示计划应在周六和周日运行
我的问题是,当给定 65 时,我需要将这些值表示为文本“星期六”和“星期日”,我正在尝试在 SQL 中执行此操作
除了包含所有可能组合的巨大 CASE 语句之外,任何人都可以想到一种方法来做到这一点吗?
谢谢
我在数据库中存储了一个整数(SQLAgent 频率间隔)这个整数实际上是计划运行的一周中选定天数的总和 可能的值是这些值的任意组合
ex 65 表示计划应在周六和周日运行
我的问题是,当给定 65 时,我需要将这些值表示为文本“星期六”和“星期日”,我正在尝试在 SQL 中执行此操作
除了包含所有可能组合的巨大 CASE 语句之外,任何人都可以想到一种方法来做到这一点吗?
谢谢
您可以在 T-SQL 中使用按位运算符。就是这样:
SELECT
( CASE WHEN daybits & 1 = 1 THEN 'Sunday ' ELSE '' END ) +
( CASE WHEN daybits & 2 = 2 THEN 'Monday ' ELSE '' END ) +
( CASE WHEN daybits & 4 = 4 THEN 'Tuesday ' ELSE '' END ) +
...
( CASE WHEN daybits & 64 = 64 THEN 'Saturday ' ELSE '' END ) +
例如,这将产生“星期日星期六”。
我会先把它放在一个用户定义的函数上。此外,您可以使用在位级别运行的 and 来检查它 - 我认为它是 &,会更新。
更新 1:是 &,杰森已经举了一个例子。我仍然建议使用用户定义的函数:)。
编辑:这是执行位操作的 C# 代码。我在详细阅读问题之前发布了它,但我将把它留在这里作为替代方案。数据库真的是最好的地方吗...?
您可以使用数组:
// input: int value
string[] weekdays = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Saturday" };
int flag = 1
List<string> days = new List<string>();
foreach (string day in days) {
if ((value && flag) != 0) {
days.Add(day);
}
flag <<= 1;
}
结果是一个字符串列表,如果要合并它们,例如可以执行以下操作:
string selected = String.Join(", ", days.ToArray());
DECLARE @in INTEGER;
SET @in = 63;
WITH series(n) AS
(
SELECT 0
UNION ALL
SELECT n + 1
FROM series
WHERE n < 6
)
SELECT CASE WHEN ROW_NUMBER() OVER (ORDER BY n) > 1 THEN ', ' ELSE '' END + DATENAME(weekday, DATEADD(day, n, '1980-09-03'))
FROM series
WHERE (POWER(2, n) & @in) > 0
ORDER BY n
FOR XML PATH ('')