sql >> Database teknologi >  >> RDS >> Sqlserver

Beregning af dage til ekskludering af weekender (mandag til fredag) i SQL Server

Jeg vil altid anbefale en kalendertabel , så kan du blot bruge:

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

Da SQL ikke har kendskab til nationale helligdage, repræsenterer for eksempel antallet af hverdage mellem to datoer ikke altid antallet af arbejdsdage. Derfor er en kalendertabel et must for de fleste databaser. De tager ikke meget hukommelse og forenkler mange forespørgsler.

Men hvis dette ikke er en mulighed, så kan du relativt nemt generere en tabel med datoer på farten og bruge denne

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

REDIGER

Hvis du har brug for at beregne forskellen mellem to datokolonner, kan du stadig bruge din kalendertabel som sådan:

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;

Eksempel på SQL-Fiddle



  1. Hvordan implementerer man PostgresQL tsvector til fuldtekstsøgning ved hjælp af Sequelize?

  2. PHP MySQL-datosammenligning

  3. Dvale> CLOB> Oracle :(

  4. PHP echoed variabel returnerer en mysql forespørgselsstreng