sql >> Database >  >> RDS >> Sqlserver

Krijg alle datums tussen twee datums in SQL Server

Mijn eerste suggestie zou zijn om je kalendertabel te gebruiken, als je er geen hebt, maak er dan een aan. Ze zijn erg handig. Uw vraag is dan zo simpel als:

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

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

Als u geen kalendertabel wilt of kunt maken, kunt u dit nog steeds on-the-fly doen zonder een recursieve 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;

Zie voor meer informatie hierover:

  • Genereer een set of reeks zonder lussen – deel 1
  • Genereer een set of reeks zonder lussen – deel 2
  • Genereer een set of reeks zonder lussen – deel 3

Wat betreft het gebruik van deze reeks datums in een cursor, zou ik je echt aanraden een andere manier te vinden. Er is meestal een op een set gebaseerd alternatief dat veel beter zal presteren.

Dus met uw gegevens:

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

Om de hoeveelheid op 28-04-2014 te krijgen (waarvan ik begrijp dat dit uw vereiste is), heeft u geen van de bovenstaande dingen nodig, u kunt gewoon het volgende gebruiken:

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

Als je het niet wilt voor een bepaald item:

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. Status en systeemvariabelen bekijken in MySQL Workbench met behulp van de GUI

  2. lange waarde opslaan in Android-database

  3. UPPER() – Converteren naar hoofdletters in PostgreSQL

  4. Beveiligingsoverwegingen voor MariaDB-implementaties in een hybride cloudomgeving