如何确定按位值中的最大位

时间:2012-09-17 20:23:37

标签: sql sql-server tsql

我想知道在T-SQL中确定二进制值中的最大数字是否有一个简短的方法(没有编程整个事情)。

在列中,我按位存储选择的日期(1 = sunday, 2 = monday, .. 7 = saturday)。

我的翻译表:

-- day of week
-- 1 == 1       -> POWER(2,0) -> sunday
-- 2 == 2       -> POWER(2,1) -> monday
-- 3 == 4       -> POWER(2,2)
-- 4 == 8       -> POWER(2,3)
-- 5 == 16      -> POWER(2,4)
-- 6 == 32      -> POWER(2,5)
-- 7 == 64      -> POWER(2,6) -> saturday

因此,如果我选择 FOR EXAMPLE 星期日和星期六,我的二进制值为65。

如何选择T-SQL 65 7


修改

假设我有两个记录,有两列:

 ID   | SelectedDays 
------|--------------
 1    | 65
 2    | 3

因此,ID 1将返回7,因为这将是选定的星期六,ID 2将在星期一返回。

6 个答案:

答案 0 :(得分:6)

 SELECT FLOOR(LOG(bit_week)/LOG(2))+1

根据日期返回1到7 logaritm是基数2中obtanin logaritm的power的倒数,诀窍是“除以基数”。反过来,FLOOR提供了最有意义的位。

答案 1 :(得分:4)

在SQL Server 2012中,您可以使用第二个参数来获取Log base 2值,因此我认为您的星期几是:

FLOOR(LOG(binarycolumn,2)+1)

如果没有,你可以做一些像kludgy这样的事情:

CASE WHEN BinaryColumn >=64 THEN 7
     WHEN BinaryColumn >=32 THEN 6
     WHEN BinaryColumn >=16 THEN 5
     WHEN BinaryColumn >=8  THEN 4
     WHEN BinaryColumn >=4  THEN 3
     WHEN BinaryColumn >=1  THEN 2
     ELSE                        1
     END

答案 2 :(得分:1)

在C#中你可以做类似下面的事情

        int i = 65;
        var b = Convert.ToString(i, 2).PadLeft(8, '0'); //pad to 8 bit binary
        var c = Math.Pow(2, 7 - b.IndexOf("1"));

--------抱歉错过了编辑------

var c = Enumerable.Range(0, b.Length).Where(x=>b[x] == '1').ToArray();

答案 3 :(得分:1)

如果你将你的枚举声明为标志,那么只要你存储在INT列中,使用就可以直接使用它而不需要在SQL端进行任何重复数据包。

[Flags]
enum Day
{
  Sunday =1,
  Monday,
  Tuesday
  ....
  Saturday
}

var day = Day.Sunday | Day.Saturday //Internally enum will have bit flags set for 65.

您可以在DB中将此值作为整数插入。

要加载它,只需加载day的值并设置枚举。 SQL中没有什么需要做的;只是SELECT Day FROM MyTable

在你的C#上

//Sample query for retrieving 
Day day = (Day)db.ExecuteScalar("SELECT Day FROM MyTable WHERE ID = 'someid'");

答案 4 :(得分:1)

POWER()计算的反向是通过功率的倒数(1/2)来计算。 例如: (周一,周三,周五= 2 + 8 + 32 = 42) 反向功率为POWER(42.0,(1.0 / 2.0))= 6.5。截断小数字给你6.(星期五)。

SELECT Convert(int,power(Convert(Decimal,SelectedDays),0.5))

答案 5 :(得分:0)

如果你只是在寻找周六的所有价值

select * from table where dayOfWeek >= 64