sql >> Database teknologi >  >> RDS >> Sqlserver

Hent alle datoer mellem to datoer i SQL Server

Mit første forslag ville være at bruge din kalendertabel, hvis du ikke har en, så opret en. De er meget nyttige. Din forespørgsel er så simpel som:

DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT  Date
FROM    dbo.Calendar
WHERE   Date >= @MinDate
AND     Date < @MaxDate;
 

Hvis du ikke vil eller ikke kan oprette en kalendertabel, kan du stadig gøre dette på et øjeblik uden en rekursiv CTE:

DECLARE @MinDate DATE = '20140101',
        @MaxDate DATE = '20140106';

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;
 

For yderligere læsning om dette se:

  • Generer et sæt eller en sekvens uden loops – del 1
  • Generer et sæt eller en sekvens uden loops – del 2
  • Generer et sæt eller en sekvens uden loops – del 3

Med hensyn til så at bruge denne sekvens af datoer i en markør, vil jeg virkelig anbefale dig at finde en anden måde. Der er normalt et sæt baseret alternativ, der vil yde meget bedre.

Så med dine data:

date | it_cd | qty 24-04-14 | i-1 | 10 26-04-14 | i-1 | 20

For at få mængden den 28-04-2014 (som jeg forstår er dit krav), behøver du faktisk ikke noget af ovenstående, du kan blot bruge:

SELECT  TOP 1 date, it_cd, qty 
FROM    T
WHERE   it_cd = 'i-1'
AND     Date <= '20140428'
ORDER BY Date DESC;
 

Hvis du ikke vil have det til en bestemt vare:

SELECT  date, it_cd, qty 
FROM    (   SELECT  date, 
                    it_cd, 
                    qty, 
                    RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id 
                                                    ORDER BY date DESC)
            FROM    T
            WHERE   Date  <= '20140428'
        ) T
WHERE   RowNumber = 1;
 


  1. Hvordan gemmer man adgangskoder sikkert i databasen?

  2. Find dublerede rækker i SQL Server

  3. ROUND() Eksempler i SQL Server

  4. VÆLG fra tabel med Varierende IN-liste i WHERE-sætning