2009-03-03 8 views
2

J'ai un entier stocké dans une base de données (SQLAgent Frequency Interval) Cet entier est en réalité la somme des jours de la semaine que le programme doit exécuter Les valeurs possibles sont n'importe quelle combinaison de ces valeursConvertir un nombre entier en une liste de jours de la semaine

  • dimanche = 1
  • lundi = 2
  • mardi = 4
  • mercredi 8 =
  • jeudi = 16
  • vendredi = 32
  • samedi = 64

ex 65 signifie que le calendrier devrait courir le samedi et le dimanche

Mon problème est que je dois représenter ces valeurs que le texte « samedi » et "Dimanche" quand donné 65 et j'essaye de faire ceci dans le SQL

Autre qu'une déclaration CASE énorme avec toutes les combinaisons possibles quelqu'un peut-il penser à un moyen de faire ceci?

Merci

Répondre

10

Vous pouvez utiliser peu sage opérateurs dans T-SQL. Voici comment:

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

Cela produira "Sunday Saturday" par exemple.

+0

Très cool J'ai trouvé un article sur ce sujet aussi! http://sqlfool.com/2009/02/bitwise-operations/ – WACM161

0

Je commencerais par le mettre sur une fonction définie par l'utilisateur. En outre, vous pouvez utiliser un et qui fonctionne au niveau des bits pour vérifier - je pense que c'est &, va mettre à jour.

Mise à jour 1: Il était &, Jason déjà mis en place un exemple. Je recommande encore d'utiliser une fonction définie par l'utilisateur pour cela :).

0

Éditer: Ceci est un code C# pour effectuer les opérations sur les bits. Je l'ai posté avant de lire la question en détail, mais je vais le laisser ici comme une alternative. La base de données est-elle vraiment le meilleur endroit pour faire ceci ...?

Vous pouvez utiliser un tableau:

// 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; 
} 

Le résultat est une liste de chaînes, si vous voulez les fusionner, vous pouvez par exemple faire:

string selected = String.Join(", ", days.ToArray()); 
+0

il dit qu'il fait dans sql –

+0

Elégante TSQL il Guffa: p – leppie

+0

Je n'ai pas vérifié les étiquettes trop bien avant d'écrire le code ...: P Eh bien, le principe est le même. – Guffa

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 ('') 
Questions connexes