/ / 1つのフィールドに格納された複数の曜日-sql、sql-server-2008、date

1つのフィールドに複数の曜日が格納されている - sql、sql-server-2008、date

特定の整数フィールドがデータを格納する方法に関して、精神的な障害に少し遭遇しました。

具体的には、整数を持つ列がありますその範囲は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を作成することを強くお勧めします。