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??


編集

2 つの列を持つ 2 つのレコードがあるとします。

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

したがって、ID 17 が返されます。これは、選択された土曜日が選択され、ID 2月曜日に返されるためです。

4

6 に答える 6

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

これは、日付に応じて1から7を返します。は、基数2のobtanin logaritm
logaritmの逆です。トリックは、「基数で除算する」です。power次に、FLOORは最も重要なビットを提供します。

于 2012-09-17T20:41:02.360 に答える
4

SQL Server 2012 では、2 番目のパラメーターを使用して対数の基数 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に挿入できます。

ロードするには、日の値をロードして列挙型を設定するだけです。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 に答える