首页 文章

将整数转换为工作日列表

提问于
浏览
2

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

  • 星期天= 1

  • 星期一= 2

  • 星期二= 4

  • 星期三= 8

  • 星期四= 16

  • 星期五= 32

  • 星期六= 64

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

我的问题是我需要在给出65时将这些值表示为文本“Saturday”和“Sunday”,我试图在SQL中执行此操作

除了一个包含所有可能组合的巨大CASE声明之外,有没有人能想到这样做的方法?

谢谢

4 回答

  • 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 ) +
    

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

  • 0

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

    Update 1: 这是&,杰森已经举了一个例子 . 我仍然建议使用用户定义的函数:) .

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

相关问题