2

我想知道是否有一种简短的方法(无需对整个事物进行编程)来确定 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

因此,如果我选择星期天和星期六的示例,我的二进制值为 65。

T-SQL我该如何选择657


编辑

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

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

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

4

6 回答 6

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

这将根据日期返回 1 到 7。
logaritm是以power2 为底的 obtanin 对数的倒数,诀窍是“除以底数”。FLOOR 反过来提供了最重要的位。

于 2012-09-17T20:41:02.360 回答
4

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

FLOOR(LOG(binarycolumn,2)+1)

如果没有,你可以做一些笨拙的事情,比如:

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
于 2012-09-17T20:43:03.317 回答
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();
于 2012-09-17T20:38:47.220 回答
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'");
于 2012-09-17T20:40:44.163 回答
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))

于 2012-09-17T20:42:19.420 回答
0

如果您只是在寻找星期六的所有值

select * from table where dayOfWeek >= 64
于 2012-09-17T20:32:03.577 回答