sql >> Databasteknik >  >> RDS >> Sqlserver

Beräknar dagar till exklusive helger (måndag till fredag) i SQL Server

Jag skulle alltid rekommendera en kalendertabell , då kan du helt enkelt använda:

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

Eftersom SQL inte har någon kunskap om nationella helgdagar representerar till exempel antalet veckodagar mellan två datum inte alltid antalet arbetsdagar. Det är därför en kalendertabell är ett måste för de flesta databaser. De tar inte mycket minne och förenklar många frågor.

Men om detta inte är ett alternativ kan du generera en tabell över datum relativt enkelt i farten och använda denna

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

REDIGERA

Om du behöver beräkna skillnaden mellan två datumkolumner kan du fortfarande använda din kalendertabell som så:

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;

Exempel på SQL-Fiddle



  1. SQL Saknar höger parentes på order by-sats

  2. Hur simulerar man DEADLOCK på SQL Server?

  3. Hur kör jag en mysql-fråga i wordpress?

  4. Hur undviker man dela med noll-fel i SQL?