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