sql >> Database >  >> RDS >> Sqlserver

Dagen berekenen tot weekends (maandag tot vrijdag) niet meegerekend in SQL Server

Ik zou altijd een Kalendertabel , dan kunt u eenvoudig het volgende gebruiken:

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

Omdat SQL bijvoorbeeld geen kennis heeft van nationale feestdagen, geeft het aantal weekdagen tussen twee datums niet altijd het aantal werkdagen weer. Daarom is een kalendertabel een must voor de meeste databases. Ze nemen niet veel geheugen in beslag en vereenvoudigen veel zoekopdrachten.

Maar als dit geen optie is, kunt u relatief eenvoudig een tabel met datums genereren en deze gebruiken

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);

BEWERKEN

Als u het verschil tussen twee datumkolommen moet berekenen, kunt u uw kalendertabel nog steeds als volgt gebruiken:

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;

Voorbeeld op SQL-Fiddle



  1. SQL Update Maria DB met voorbereide instructie

  2. Alias ​​gebruiken in When-gedeelte van een Case-instructie in Oracle SQL

  3. Varchar(MAX) versus TEXT gebruiken op SQL Server

  4. Hoe het paginanummer in de rapporttekst van SSRS 2008 R2 weer te geven?