質問

データベースに格納された整数があります(SQLAgent Frequency Interval)この整数は、実際にはスケジュールが実行される選択された曜日の合計です 可能な値は、これらの値の任意の組み合わせです

  • 日曜日= 1
  • 月曜日= 2
  • 火曜日= 4
  • 水曜日= 8
  • 木曜日= 16
  • 金曜日= 32
  • 土曜日= 64

ex 65は、スケジュールが土曜日と日曜日に実行されることを意味します

私の問題は、これらの値をテキスト" Saturday"として表す必要があることです。および「日曜日」 65を与えられ、SQLでこれをやろうとしているとき

可能なすべての組み合わせを含む巨大なCASEステートメント以外に、誰でもこれを行う方法を考えることができますか?

ありがとう

役に立ちましたか?

解決

T-SQLでビット演算子を使用できます。方法は次のとおりです。

SELECT
  ( CASE WHEN daybits & 1 = 1 THEN 'Sunday ' ELSE '' END ) +
  ( CASE WHEN daybits & 2 = 2 THEN 'Monday ' ELSE '' END ) +
  ( CASE WHEN daybits & 4 = 4 THEN 'Tuesday ' ELSE '' END ) +
  ...
  ( CASE WHEN daybits & 64 = 64 THEN 'Saturday ' ELSE '' END ) +

これにより、「日曜日土曜日」が生成されます。たとえば。

他のヒント

まず、ユーザー定義関数に配置します。 また、それをチェックするためにビットレベルで動作するandを使用することができます。

更新1:それは&で、ジェイソンはすでに例を挙げています。ユーザー定義関数を使用することをお勧めします:)。

編集:これはビット操作を行うC#コードです。質問を詳しく読む前に投稿しましたが、代わりにここに残しておきます。データベースは本当にこれを行うのに最適な場所ですか?

配列を使用できます:

// input: int value
string[] weekdays = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Saturday" };
int flag = 1
List<string> days = new List<string>();
foreach (string day in days) {
   if ((value && flag) != 0) {
      days.Add(day);
   }
   flag <<= 1;
}

結果は文字列のリストになります。それらをマージする場合は、たとえば次のようにします。

string selected = String.Join(", ", days.ToArray());
DECLARE @in INTEGER;
SET @in = 63;
WITH series(n) AS
    (
    SELECT  0
    UNION ALL
    SELECT  n + 1
    FROM    series
    WHERE   n < 6
    )
SELECT  CASE WHEN ROW_NUMBER() OVER (ORDER BY n) > 1 THEN ', ' ELSE '' END + DATENAME(weekday, DATEADD(day, n, '1980-09-03')) 
FROM    series
WHERE   (POWER(2, n) & @in) > 0
ORDER BY n
FOR XML PATH ('')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top