sql >> Databáze >  >> RDS >> Sqlserver

Výpočet dnů do vyloučení víkendů (pondělí až pátek) na serveru SQL

Vždy bych doporučil Tabulku kalendáře , pak můžete jednoduše použít:

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

Protože SQL nezná státní svátky, například počet dnů v týdnu mezi dvěma daty vždy nepředstavuje počet pracovních dnů. To je důvod, proč je kalendářová tabulka pro většinu databází nutností. Nezabírají mnoho paměti a zjednodušují mnoho dotazů.

Pokud to však není možné, můžete tabulku s daty vygenerovat poměrně snadno za chodu a použít toto

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

UPRAVIT

Pokud potřebujete vypočítat rozdíl mezi dvěma sloupci data, můžete stále použít tabulku kalendáře takto:

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;

Příklad na SQL-Fiddle



  1. Chyba MySQl #1064

  2. Vytvořte databázový poštovní profil (SSMS)

  3. jak nastavit délku mysql datetype pomocí sequelize-cli

  4. Nesprávná syntaxe poblíž '(' při kontrole fragmentace indexu