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

T-SQL získá počet pracovních dnů mezi 2 daty

Prosím, prosím, použijte prosím kalendářovou tabulku. SQL Server neví nic o státních svátcích, firemních událostech, přírodních katastrofách atd. Sestavení kalendářové tabulky je poměrně snadné, zabere extrémně málo místa a bude v paměti, pokud je dostatečně odkazováno.

Zde je příklad, který vytvoří tabulku kalendáře s 30 lety dat (2000 -> 2029), ale vyžaduje pouze 200 KB na disku (136 KB, pokud používáte kompresi stránky). To je téměř zaručeno, že bude menší než přidělení paměti potřebné ke zpracování nějaké CTE nebo jiné sady za běhu.

CREATE TABLE dbo.Calendar
(
  dt DATE PRIMARY KEY, -- use SMALLDATETIME if < SQL Server 2008
  IsWorkDay BIT
);

DECLARE @s DATE, @e DATE;
SELECT @s = '2000-01-01' , @e = '2029-12-31';

INSERT dbo.Calendar(dt, IsWorkDay)
  SELECT DATEADD(DAY, n-1, '2000-01-01'), 1 
  FROM
  (
    SELECT TOP (DATEDIFF(DAY, @s, @e)+1) ROW_NUMBER() 
      OVER (ORDER BY s1.[object_id])
      FROM sys.all_objects AS s1
      CROSS JOIN sys.all_objects AS s2
  ) AS x(n);

SET DATEFIRST 1;

-- weekends
UPDATE dbo.Calendar SET IsWorkDay = 0 
  WHERE DATEPART(WEEKDAY, dt) IN (6,7);

-- Christmas
UPDATE dbo.Calendar SET IsWorkDay = 0 
  WHERE MONTH(dt) = 12
  AND DAY(dt) = 25
  AND IsWorkDay = 1;

-- continue with other holidays, known company events, etc.

Nyní se dotaz, který hledáte, píše celkem jednoduše:

SELECT COUNT(*) FROM dbo.Calendar
  WHERE dt >= '20130110'
    AND dt <  '20130115'
    AND IsWorkDay = 1;

Více informací o kalendářových tabulkách:

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

Více informací o generování sad bez smyček:

http://www.sqlperformance.com/tag/date-ranges

Dejte si také pozor na malé věci, jako je spoléhání se na anglický výstup DATENAME . Zaznamenal jsem přerušení několika aplikací, protože někteří uživatelé měli nastavení jiného jazyka, a pokud se spoléháte na WEEKDAY ujistěte se, že jste nastavili DATEFIRST správné nastavení...



  1. Nainstalovat mysql-python (Windows)

  2. Jak převést řetězec na datum/čas na serveru SQL pomocí CAST()

  3. Jak vrátit pouze datum z datového typu SQL Server DateTime

  4. Při prvním spuštění nelze načíst databázi sqlite