Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

T-SQL uzyskuje liczbę dni roboczych między 2 datami

Proszę, proszę, użyj tabeli kalendarza. SQL Server nie wie nic o świętach państwowych, wydarzeniach firmowych, klęskach żywiołowych itp. Tabela kalendarza jest dość łatwa do zbudowania, zajmuje bardzo mało miejsca i będzie znajdować się w pamięci, jeśli jest do niej wystarczająco odwołana.

Oto przykład, który tworzy tabelę kalendarza z 30-letnimi datami (2000 -> 2029), ale wymaga tylko 200 KB na dysku (136 KB w przypadku kompresji strony). Jest to prawie gwarantowane, że jest to mniej niż przydział pamięci wymagany do przetworzenia niektórych CTE lub innych ustawionych w czasie wykonywania.

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.

Teraz zapytanie, którego szukasz, jest dość proste do napisania:

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

Więcej informacji o tabelach kalendarza:

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

Więcej informacji o generowaniu zestawów bez pętli:

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

Uważaj również na drobiazgi, takie jak poleganie na angielskim danych wyjściowych DATENAME . Widziałem kilka aplikacji, które przestały działać, ponieważ niektórzy użytkownicy mieli inne ustawienia języka, a jeśli polegasz na WEEKDAY upewnij się, że ustawiłeś DATEFIRST ustawienie odpowiednio...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - sprzężenie wewnętrzne podczas aktualizacji

  2. Czy możliwe jest wykonanie wielu aktualizacji za pomocą jednej instrukcji UPDATE SQL?

  3. Jak wstawić obiekt blob do bazy danych za pomocą studia zarządzania serwerem sql

  4. WHERE IS NULL, IS NOT NULL lub NO WHERE w zależności od wartości parametru SQL Server

  5. Jak przyspieszyć działanie serwera SQL za pomocą monitorowania wydajności bazy danych?