我想知道在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
将在星期一返回。
答案 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