Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将按位整数值转换为月日掩码_Sql_Sql Server_Tsql_Common Table Expression - Fatal编程技术网

Sql 将按位整数值转换为月日掩码

Sql 将按位整数值转换为月日掩码,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,如果我不知道,我道歉。我现在只写了大约3年的T-SQL,大部分都是自学的。在我的工作中,我们将月日值存储在位掩码中。例如,1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx转换为1,1234567891011213141516171819202122232425262728293031转换为2147483647。我想要/需要做的是将int值转换为包含数字和“x”字符的varchar(64)。我这里有另一段代码,它做了一些类似的调整,但它向后提供了数据(从右到左[二进制应该是这样]

如果我不知道,我道歉。我现在只写了大约3年的T-SQL,大部分都是自学的。在我的工作中,我们将月日值存储在位掩码中。例如,1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx转换为1,1234567891011213141516171819202122232425262728293031转换为2147483647。我想要/需要做的是将int值转换为包含数字和“x”字符的varchar(64)。我这里有另一段代码,它做了一些类似的调整,但它向后提供了数据(从右到左[二进制应该是这样],而不是从左到右)

它也不提供所有字符。所有31个字符都必须回填


我也为这一点玩过

您可以使用数字表将
@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

此解决方案使用一个称为数字表的系统表,但使用自己的系统表并不是一个坏主意。

“1234567891011213141516171819202122232425262728293031如何转换为2147483647”?一个位掩码肯定只能是1和0吗?@Phil这个53个字符的字符串
1234567891011213141516171819202122232425262728293031
将一个月的所有31天连接起来<二进制代码>1111111111111111111十进制代码=
2147483647
哦,我明白了。这不是很明显!谢谢我很抱歉,我刚刚看到这个。。。我没有注意到有人回答!我会在第一个可能的机会尝试这个。
--------------------------------
x1x1x1xxxxxxxxxxxxxxxxxxxxxxxxx