特定の整数フィールドがデータを格納する方法に関して、精神的な障害に少し遭遇しました。
具体的には、整数を持つ列がありますその範囲は1〜127です。各整数は、異なる曜日の組み合わせを表します。例:月曜日= 2 ^ 0または1、火曜日= 2 ^ 2または2、水曜日= 2 ^ 3または8。追加オプションを使用して、月曜日+火曜日= 3。
見つかった例を使用して日付値を部分的に抽出することができました ここに。ただし、その特定の例は、2日が加算されると機能しません(月曜日+火曜日= 3など)。誰かが私を正しい方向に向けることができますか?
参考までに、SQL Server 2008 R2を使用しています。これが以前に投稿されていた場合は申し訳ありませんが、私は見てみましたが、他の投稿を見つけることができませんでした。
回答:
回答№1は1あなたが扱っているものは、ビット演算子と呼ばれます。
ここでは、 良い読書 明確でシンプルな例があります。
完全を期すために、ここではあなたが見ているものを、各曜日の列に分解しています。
DECLARE @bitwise TABLE (someValue TINYINT)
INSERT INTO @bitwise (someValue)
SELECT 1 UNION
SELECT 5 UNION
SELECT 127
SELECT someValue, CASE WHEN (1&someValue)=1 THEN "SUNDAY" END
, CASE WHEN (2&someValue)=2 THEN "MONDAY" END
, CASE WHEN (4&someValue)=4 THEN "TUESDAY" END
, CASE WHEN (8&someValue)=8 THEN "WEDNESDAY" END
, CASE WHEN (16&someValue)=16 THEN "THURSDAY" END
, CASE WHEN (32&someValue)=32 THEN "FRIDAY" END
, CASE WHEN (64&someValue)=64 THEN "SATURDAY" END
FROM @bitwise
回答№2については2
必要なビットを取得して、曜日ごとに結果を独自のフィールドに保存できるようです。
SELECT
cast(day_of_week & 1 as bit) AS "Monday",
cast(day_of_week & 2 as bit) AS "Tuesday",
cast(day_of_week & 4 as bit) AS "Wednesday",
cast(day_of_week & 8 as bit) AS "Thursday",
etc...
回答№3の場合は0
ほとんどの場合、ビット演算子を使用する必要があります。
SELECT *
FROM Table
WHERE DaysOfWeek & 3 = 3
または、より理にかなっている場合:
SELECT *
FROM Table
WHERE DaysOfWeek & 1 = 1
AND DaysOfWeek & 2 = 2
@JNevillが説明するようなクエリでVIEWを作成することを強くお勧めします。