Convert integer to a list of week days

后端 未结 4 1311
借酒劲吻你
借酒劲吻你 2021-01-21 13:45

I have an integer stored in a database (SQLAgent Frequency Interval) This integer is actually the sum of the selected days of the week that the schedule is to run The possible v

相关标签:
4条回答
  • 2021-01-21 14:28

    I would start by putting it on an user defined function. Also, you can use an and that operates at the bit level to check for it - I think it is &, will update.

    Update 1: It was &, Jason already put up an example. I still recommend to use an user defined function for it :).

    0 讨论(0)
  • 2021-01-21 14:40
    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 ('')
    
    0 讨论(0)
  • 2021-01-21 14:42

    Edit: This is C# code to do the bit operations. I posted it before reading the question in detail, but I will leave it here as an alternative. Is the database really the best place to do this...?

    You can use an array:

    // 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;
    }
    

    The result is a list of strings, if you want to merge them you can for example do:

    string selected = String.Join(", ", days.ToArray());
    
    0 讨论(0)
  • 2021-01-21 14:46

    You can use bit-wise operators in T-SQL. Here's how:

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

    That will produce "Sunday Saturday" for example.

    0 讨论(0)
提交回复
热议问题