2

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

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

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

私の問題は、65 を指定したときにこれらの値をテキスト「土曜日」と「日曜日」として表す必要があり、SQL でこれを実行しようとしていることです。

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

ありがとう

4

4 に答える 4

10

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 ) +

たとえば、「Sunday Saturday」が生成されます。

于 2009-03-03T15:23:57.373 に答える
0

私はそれをユーザー定義関数に置くことから始めます。また、ビット レベルで動作する and を使用してチェックすることもできます。これは & だと思います。

更新 1: &、Jason は既に例を挙げています。ユーザー定義関数を使用することをお勧めします:)。

于 2009-03-03T15:15:42.743 に答える
0

編集: これは、ビット操作を行うための 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());
于 2009-03-03T15:20:18.833 に答える
0
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 ('')
于 2009-03-03T15:26:16.977 に答える