Преобразовать целое число в список дней недели - PullRequest
2 голосов
/ 03 марта 2009

У меня есть целое число, хранящееся в базе данных (интервал частоты SQLAgent). Это целое число фактически является суммой выбранных дней недели, в течение которых должно выполняться расписание. Возможные значения - любая комбинация этих значений

  • воскресенье = 1
  • Понедельник = 2
  • вторник = 4
  • Среда = 8
  • четверг = 16
  • Пятница = 32
  • Суббота = 64

ex 65 означает, что расписание должно выполняться в субботу и воскресенье

Моя проблема заключается в том, что мне нужно представить эти значения в виде текста «суббота» и «воскресенье», когда дано 65, и я пытаюсь сделать это в SQL

Кроме огромного оператора CASE со всеми возможными комбинациями, может кто-нибудь придумать, как это сделать?

Спасибо

Ответы [ 4 ]

10 голосов
/ 03 марта 2009

Вы можете использовать побитовые операторы в 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 голосов
/ 03 марта 2009
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 голосов
/ 03 марта 2009

Edit: это код 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 голосов
/ 03 марта 2009

Я бы начал с того, что поставил его на определенную пользователем функцию. Кроме того, вы можете использовать и, который работает на битовом уровне, чтобы проверить это - я думаю, что это &, обновит.

Обновление 1: Это был &, Джейсон уже привел пример. Я все еще рекомендую использовать пользовательскую функцию для него:).

...