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
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.