0
votes

Comment obtenir toutes les lignes de la table du calendrier à l'aide d'un résultatsset comme entrée

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> xxx pré>

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  


2 commentaires

Faites une jointure extérieure!


@jarlh un rejoindre extérieur gauche a fait le tour, merci


3 Réponses :


1
votes

Vous pouvez essayer d'utiliser CCE récursive avec fonction Daadd . xxx

SQLFIDDLE


1 commentaires

Cela fonctionne également, mais je pense que je vais coller avec la jointure extérieure comme suggérée par Jarlh



1
votes

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


1 commentaires

2500 est plus que suffisant dans mon cas. Les jours maximum entre seront d'environ 15. Donc, merci pour l'alternative



0
votes

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


1 commentaires

Merci de votre réponse, mais bien que cela puisse fonctionner, un curseur est de ralentir à mon goût