Question

J'ai un entier stocké dans une base de données (intervalle de fréquence SQLAgent). Cet entier correspond en fait à la somme des jours de la semaine sélectionnés pour l'exécution du planning. Les valeurs possibles sont n’importe quelle combinaison de ces valeurs

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

ex 65 signifie que l'horaire doit se dérouler les samedi et dimanche

Mon problème est que je dois représenter ces valeurs sous la forme du texte "Samedi". et " Dimanche " quand on me donne 65 et j'essaie de le faire en SQL

À part une énorme déclaration CASE avec toutes les combinaisons possibles, est-ce que quelqu'un peut penser à une façon de le faire?

Merci

Était-ce utile?

La solution

Vous pouvez utiliser des opérateurs binaires 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 "dimanche samedi" par exemple.

Autres conseils

Je commencerais par le mettre sur une fonction définie par l'utilisateur. Vous pouvez également utiliser un et qui fonctionne au niveau du bit pour le vérifier - je pense que c'est & amp ;, sera mis à jour.

Mise à jour 1: C’est & amp;, Jason a déjà donné un exemple. Je recommande quand même d’utiliser une fonction définie par l’utilisateur:).

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

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 souhaitez les fusionner, vous pouvez par exemple:

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 ('')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top