问题:如何从给定数字中找出该数字由哪些数字组成?
“星期日= 1”,“星期一= 2”,“星期二= 4”,星期三= 8”,“星期四= 16“,”星期五= 32“,”星期六= 64“
例如:给出数字109,则表示星期日,星期二,星期三,星期五,星期六
答案 0 :(得分:1)
您可以执行以下操作。
CREATE FUNCTION dbo.Int2BinaryToWeekDay (@i INT) RETURNS NVARCHAR(2048) AS BEGIN
RETURN
CASE WHEN CONVERT(VARCHAR(16), @i & 64 ) > 0 THEN 'Saturday,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 32 ) > 0 THEN 'Friday,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 16 ) > 0 THEN 'Thurday,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 8 ) > 0 THEN 'Wed,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 4 ) > 0 THEN 'Tuesday,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 2 ) > 0 THEN 'Monday,' ELSE '' END +
CASE WHEN CONVERT(VARCHAR(16), @i & 1 ) > 0 THEN 'Sunday,' ELSE '' END
END;
GO
现在做以下事情。
SELECT dbo.Int2BinaryToWeekDay(109)
答案 1 :(得分:1)
看起来像一个二进制设计。您需要使用按位&运算符来获取所需的输出。
Decimal = Binary
109 = 1101101
001 = 0000001
------&------
0000001 = 1
109 = 1101101
002 = 0000010
------&------
0000000 = 0
109 = 1101101
004 = 0000100
------&------
0000100 = 4
SQL Server内置了bitwise operators。您可以像这样利用按位&
DECLARE @InputNum INT = 109
SELECT ISNULL(STUFF(CASE WHEN @InputNum & 1 > 0 THEN ', SUN' ELSE '' END +
CASE WHEN @InputNum & 2 > 0 THEN ', MON' ELSE '' END +
CASE WHEN @InputNum & 4 > 0 THEN ', TUE' ELSE '' END +
CASE WHEN @InputNum & 8 > 0 THEN ', WED' ELSE '' END +
CASE WHEN @InputNum & 16 > 0 THEN ', THU' ELSE '' END +
CASE WHEN @InputNum & 32 > 0 THEN ', FRI' ELSE '' END +
CASE WHEN @InputNum & 64 > 0 THEN ', SAT' ELSE '' END,1,2,''),'')
查看MS文档以获取有关按位运算符的更详细说明。