Преобразовать побитовые значения int в маску дня месяца - PullRequest
1 голос
/ 21 марта 2012

Я прошу прощения, если мне кажется, что я не знаю.Я пишу на T-SQL только около 3 лет, и большинство из них самоучки.На моей работе мы храним значения Дня месяца в битовых масках.например.1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx преобразуется в 1, а 12345678910111213141516171819202122232425262728293031 преобразуется в 2147483647. Что я хочу / нужно сделать, это преобразовать значение int в varchar (64), содержащий числа и символы «x».У меня есть следующий код из другого post , который делает нечто похожее с некоторой настройкой, но он предоставляет данные в обратном направлении (справа налево [как это должно быть для двоичного кода) вместо слева направо).

    declare @i int /* input */
    set @i = 42

    declare @result varchar(32) /* SQL Server int is 32 bits wide */
    set @result = ''
    while 1 = 1 begin
     select @result = convert(char(1), @i % 2) + @result,
           @i = convert(int, @i / 2)
     if @i = 0 break
    end

    select Replace(@result,'0','X')

Также не все символы.Все 31 символ должны быть заполнены.

Я также играл с Простым рекурсивным CTE Роба Фарли для этого.

1 Ответ

2 голосов
/ 21 марта 2012

Вы можете использовать таблицу чисел, чтобы разбить @i на биты, а затем объединить биты в значение varchar(32):

DECLARE @i int = 42;

WITH bits AS (
  SELECT
    number,
    B = CASE @i & POWER(2, number - 1) WHEN 0 THEN 'x' ELSE '1' END
  FROM master..spt_values
  WHERE type = 'P'
    AND number BETWEEN 1 AND 31
)
SELECT CAST((
  SELECT '' + B
  FROM bits
  ORDER BY number
  FOR XML PATH ('')
) AS varchar(32))

Результат:

--------------------------------
x1x1x1xxxxxxxxxxxxxxxxxxxxxxxxx

Это решение использует системную таблицу с именем master..spt_values в качестве таблицы чисел, но никогда не помешает сгенерировать и использовать вместо нее свою собственную.

...