sql >> Databáze >  >> RDS >> Sqlserver

Získejte všechna data mezi dvěma daty na serveru SQL Server

Můj první návrh by byl použít vaši kalendářovou tabulku, pokud ji nemáte, vytvořte si ji. Jsou velmi užitečné. Váš dotaz je pak stejně jednoduchý jako:

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

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

Pokud nechcete nebo nemůžete vytvořit tabulku kalendáře, můžete to udělat za chodu bez rekurzivního 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;

Další informace o tomto viz:

  • Vygenerujte sadu nebo sekvenci bez smyček – část 1
  • Vygenerujte sadu nebo sekvenci bez smyček – část 2
  • Vygenerujte sadu nebo sekvenci bez smyček – část 3

S ohledem na použití této posloupnosti dat v kurzoru bych vám opravdu doporučil najít jiný způsob. Obvykle existuje alternativa založená na sadě, která bude fungovat mnohem lépe.

Takže s vašimi údaji:

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

Chcete-li získat množství dne 28. 4. 2014 (zjišťuji, že je to váš požadavek), ve skutečnosti nepotřebujete nic z výše uvedeného, ​​můžete jednoduše použít:

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

Pokud to pro konkrétní položku nechcete:

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. Řešení konfliktů primárního klíče při vkládání dat do SQLite

  2. Začínáme s GearHost pro vývoj databáze MySQL

  3. Nelze najít uloženou proceduru 'dbo.aspnet_CheckSchemaVersion'

  4. Vytvoření kopie databáze v PostgreSQL