Requête SQL WHERE sur une plage de dates

Dans mon tableau, j'ai 118 dossiers détaillant des projets. Les 2 champs qui m'intéressent ici sont startdate et enddate.

J'ai besoin de produire un rapport à partir de cette vue qui montre quels projets étaient «actifs» entre les plages de dates suivantes:

01/01/2011 – 01/12/2011

J'ai essayé la suite WHERE suivante:

WHERE startdate BETWEEN '01/04/2011' AND '01/12/2011' OR enddate BETWEEN '01/04/2011' AND '01/12/2011' OR startdate <= '01/04/2011' AND enddate >= '01/12/2011' 

Ce qui apparaît ne semble pas correct, il y a seulement quelques loggings affichés et beaucoup que je connais pour un fait devraient être affichés ne sont pas, comme un projet avec une date de début du 20/07/2011 et enddate du 21/11 / 2011 disparaît lorsque la requête WHERE est exécutée.

Quelqu'un peut-il voir une faute avec cette requête WHERE

entrez la description de l'image ici

 WHERE startdate <= '2011-12-01' AND enddate >= '2011-01-01' 

(En supposant que la valeur de enddate est la dernière date à laquelle le projet est actif)

Exemples utilisant des nombres, recherchant tout ce qui chevauche 100 à 200 …

 Start | End | Start <= 200 | End >= 100 000 | 099 | Yes | No 101 | 199 | Yes | Yes (HIT!) 201 | 299 | No | Yes 000 | 150 | Yes | Yes (HIT!) 150 | 300 | Yes | Yes (HIT!) 000 | 300 | Yes | Yes (HIT!) 

Cela a absolument besoin d'un ET dans la logique 🙂

En termes de votre requête …

Votre requête avec des parenthèses, ressemble à ceci …

 WHERE ( startdate BETWEEN '01/04/2011' AND '01/12/2011' OR enddate BETWEEN '01/04/2011' AND '01/12/2011' OR startdate <= '01/04/2011' ) AND enddate >= '01/12/2011' 

Mais votre exemple ne répond jamais à la dernière condition ET. Essayez d'append des parenthèses pour être plus explicite …

 WHERE (startdate BETWEEN '01/04/2011' AND '01/12/2011') OR (enddate BETWEEN '01/04/2011' AND '01/12/2011') OR (startdate <= '01/04/2011' AND enddate >= '01/12/2011') 

Avant l'ajout de la requête

 set dateformat dmy 

Aussi peut-être append des crochets

 WHERE (startdate BETWEEN '01/01/2011' AND '01/12/2011') OR (enddate BETWEEN '01/01/2011' AND '01/12/2011') OR (startdate <= '01/01/2011' AND enddate >= '01/12/2011') 

En supposant que startdate et enddate sont des champs de date,

Essaye ça:

 WITH Dates AS ( SELECT [Date] = @StartDate UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date]) FROM Dates WHERE [Date] <= DATEADD(DAY, -1, @EndDate) ) -- YOUR SELECT STATEMENT -- YOUR FROM STATEMENT CROSS APPLY Dates WHERE [Date] BETWEEN startdate AND enddate -- The rest of your where statement here OPTION(MAXRECURSION 0); 

En déclarant votre date de début au 01/01/2011 et votre date de fin au 01/12/2011

Tout le monde regarde cela à l'envers comparant startdate et enddate à une string quand vous pouvez comparer la string aux colonnes; ce qui suit est la manière la plus simple de déterminer ce que vous voulez:

 where ( '01/04/2011' between startdate and enddate or '01/12/2011' between startdate and enddate ) 

Ma requête originale fonctionnait, la database à laquelle je me connectais avait cependant des formats de date différents pour ma requête.