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

Obliczanie dni do wyłączenia weekendów (od poniedziałku do piątku) w SQL Server

Zawsze polecam tabela kalendarza , możesz po prostu użyć:

SELECT  COUNT(*)
FROM    dbo.CalendarTable
WHERE   IsWorkingDay = 1
AND     [Date] > @StartDate
AND     [Date] <= @EndDate;

Ponieważ SQL nie zna na przykład świąt państwowych, liczba dni roboczych między dwiema datami nie zawsze odzwierciedla liczbę dni roboczych. Dlatego tabela kalendarza jest koniecznością dla większości baz danych. Nie zajmują dużo pamięci i upraszczają wiele zapytań.

Ale jeśli nie jest to możliwe, możesz stosunkowo łatwo wygenerować tabelę dat w locie i użyć tego

SET DATEFIRST 1;
DECLARE @StartDate DATETIME = '20131103', 
        @EndDate DATETIME = '20131104';

-- GENERATE A LIST OF ALL DATES BETWEEN THE START DATE AND THE END DATE
WITH AllDates AS
(   SELECT  TOP (DATEDIFF(DAY, @StartDate, @EndDate))
            D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @StartDate)
    FROM    sys.all_objects a
            CROSS JOIN sys.all_objects b
)
SELECT  WeekDays = COUNT(*)
FROM    AllDates
WHERE   DATEPART(WEEKDAY, D) NOT IN (6, 7);

EDYTUJ

Jeśli chcesz obliczyć różnicę między dwiema kolumnami dat, nadal możesz użyć tabeli kalendarza w następujący sposób:

SELECT  t.ID,
        t.Date1,
        t.Date2,
        WorkingDays = COUNT(c.DateKey)
FROM    TestTable t
        LEFT JOIN dbo.Calendar c
            ON c.DateKey >= t.Date1
            AND c.DateKey < t.Date2
            AND c.IsWorkingDay = 1
GROUP BY t.ID, t.Date1, t.Date2;

Przykład na SQL-Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzupełnij ciąg zerami na początku, aby miał 3 znaki w SQL Server 2008

  2. 3 sposoby zwracania wierszy zawierających znaki alfanumeryczne w SQL Server

  3. Zwiększona ilość każdego wiersza w sql

  4. Lepszy sposób na sprawdzenie, czy dane już istnieją i wstawienie

  5. Czy istnieje sposób, aby nie używać nawiasów kwadratowych w SQL Server?