2017-09-15 41 views
0

Je n'arrive pas à comprendre la logique nécessaire à cette action. J'ai des données qui s'exécute mois à date pour plusieurs comptes. Je veux spécifier que la sortie ignore certains comptes pour un court laps de temps en utilisant SQL Server 2016.Corriger la logique pour découper une tranche de temps pour des comptes particuliers

Je veux exclure toutes les données entre 2017-09-14 14:30 et 2017-09-14 15: 30 mais seulement sur les comptes numérotés 310722 310820 106758 310169 mais je veux inclure les données de ces comptes (ainsi que tous les autres comptes) pour toutes les autres fois.

J'ai essayé

WHERE 
([start time] NOT BETWEEN 2017-09-14 14:30 and 2017-09-14 15:30 AND Account NOT IN (310722, 310820, 106758, 310169,)) 

mais qui coupent trop. La logique NOT et AND me gâche. quelqu'un peut-il aider?

modifier:

Il est évident que ma question est claire. Excuses. J'ai un peu de difficulté à joindre des données d'échantillon mais ci-dessous est mon meilleur effort.

Start Time   Type    Connected (secs) Account 
13/09/2017 00:02:13 Normal operator call 20   141475 
13/09/2017 00:02:15 Normal operator call 59   310523 
13/09/2017 00:03:42 Normal operator call 83   833694 

Je veux inclure toutes les données qui ne sont pas sur les comptes spécifiques pendant les périodes spécifiques. Peut-être un diagramme de Venn aidera

venn

La zone bleue est les données Je ne veux pas tout le reste, y compris les comptes mentionnés à d'autres moments et tous les autres comptes à temps mentionnés que je veux garder.

Si quelqu'un a des suggestions plus détaillées pour rendre cette question moins terrible, je les apprécierais. :)

+1

https://blog.codinghorror.com/rubber-duck-problem-solving/ Et quelqu'un poster le lien dba spaghetti aussi. –

+0

Pourriez-vous s'il vous plaît fournir quelques exemples de données et de sortie? On ne sait pas comment la logique devrait fonctionner. – EricZ

Répondre

0

Que diriez-vous d'une clause where conditionnelle?

WHERE 
    [start time] < CASE WHEN Account in (310722,310820,106758,310169) THEN '2017-09-14 14:30' ELSE DATEADD(DAY,1,GETDATE()) END 
    OR [start time] > CASE WHEN Account in (310722,310820,106758,310169) THEN '2017-09-14 15:30' ELSE '1900-01-01' END 
0

Vous pouvez utiliser cette

WHERE 
NOT ([start time] BETWEEN '2017-09-14 14:30' and '2017-09-14 15:30' AND Account IN (310722, 310820, 106758, 310169)) 
+0

cela ne retournerait pas les lignes pour les autres comptes. OP n'a pas vraiment spécifié s'ils voulaient que d'autres comptes soient retournés ou non, mais pas encore de mal :) – scsimon

+0

@scsimon Vous avez raison, on ne sait pas comment OP veut d'autres comptes. Je mettrai à jour ou effacera cette réponse une fois que l'OP aura clarifié cela. – EricZ

+0

désolé ericz j'ai mis à jour la question, je l'espère, c'est un peu plus clair. – tomdemaine