J'ai besoin de trouver toutes les dates entre 2 dates d'un résultatsset.
Ma base de données a une table de calendrier qui détient une ligne pour chaque date d'il y a quelques années à peine jusqu'à l'avenir.
Maintenant, j'ai cette requête p> et il Renvoie ce jeu de résultats P> 2018-08-15
2018-08-21
2018-09-02
2018-09-09
2018-09-15
2018-09-16
3 Réponses :
Vous pouvez essayer d'utiliser CCE récursive avec SQLFIDDLE P> P> fonction Daadd code>.
Cela fonctionne également, mais je pense que je vais coller avec la jointure extérieure comme suggérée par Jarlh
Regardez cela.
DECLARE @myTable AS TABLE (Column1 DATE, Column2 DATE);
INSERT INTO @myTable (Column1, Column2)
VALUES ('2018-08-14', '2018-08-16')
, ('2018-08-20', '2018-08-22')
, ('2018-09-01', '2018-09-03')
, ('2018-09-08', '2018-09-10')
, ('2018-09-14', '2018-09-17');
WITH cte AS
(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values)
SELECT DATEADD(DAY,rn,Column1) DayToShow
FROM @myTable
CROSS APPLY cte
WHERE DATEADD(DAY,rn,Column1) < column2
2500 est plus que suffisant dans mon cas. Les jours maximum entre seront d'environ 15. Donc, merci pour l'alternative
J'utiliserais du curseur ici. C'est comme pour chacun. S'il vous plaît essayez ce code. La sortie est @Tristtable qui contient toutes les dates
Declare @TempTable table (BetweenDate datetime)
Declare @FromDate datetime,
@ToDate datetime,
@date datetime
Declare DatesCursor Cursor For
Select FromDate, ToDate From (
select convert(date, r.LaadDatum) FromDate,
convert(date, r.LosDatum) ToDate
from tblPlanning p
inner join tblRit r on p.RitID = r.RitID
where r.ChauffeurID = 201
and (convert(date, r.LaadDatum) >= '20180812'
and convert(date, r.LaadDatum) <= '20180921')
and datediff(day, r.LaadDatum, r.LosDatum) > 1) t
Open DatesCursor
Fetch Next From DatesCursor Into @FromDate, @ToDate
While @@Fetch_Status = 0
Begin
If (@FromDate is not null and @ToDate is not null )
Begin
SET @date = DATEADD(day, 1, @FromDate)
WHILE (@date < @ToDate)
BEGIN
insert @TempTable Values(@date)
SET @date = DATEADD(day, 1, @date)
END
END
Fetch Next From DatesCursor Into @FromDate, @ToDate
End
Close DatesCursor
select * from @TempTable
Merci de votre réponse, mais bien que cela puisse fonctionner, un curseur est de ralentir à mon goût
Faites une jointure extérieure!
@jarlh un rejoindre extérieur gauche a fait le tour, merci