将整数转换为工作日列表

时间:2009-03-03 15:10:46

标签: sql-server-2005 tsql dayofweek

我有一个存储在数据库中的整数(SQLAgent频率间隔)这个整数实际上是计划运行的一周中所选日期的总和 可能的值是这些值的任意组合

  • 星期日= 1
  • 星期一= 2
  • 星期二= 4
  • 星期三= 8
  • 星期四= 16
  • 星期五= 32
  • 星期六= 64

ex 65表示时间表应该在周六和周日运行

我的问题是我需要将这些值表示为文本“星期六”和“星期日”,当给出65并且我试图在SQL中执行此操作

除了包含所有可能组合的巨大CASE声明外,还有人可以想到一种方法吗?

谢谢

4 个答案:

答案 0 :(得分:10)

您可以在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 ) +

例如,这将产生“星期六星期六”。

答案 1 :(得分:0)

我首先将它放在用户定义的函数上。 此外,你可以使用a和在比特级操作来检查它 - 我认为它是&,将会更新。

更新1:这是&,Jason已经举了一个例子。我仍然建议使用用户定义的函数:)。

答案 2 :(得分:0)

编辑:这是执行位操作的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());

答案 3 :(得分:0)

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 ('')