Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изчисляване на дни с изключение на почивните дни (от понеделник до петък) в SQL Server

Винаги бих препоръчал Календарна таблица , тогава можете просто да използвате:

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

Тъй като SQL не познава националните празници, например, броят на дните от седмицата между две дати не винаги представлява броя на работните дни. Ето защо календарната таблица е задължителна за повечето бази данни. Те не заемат много памет и опростяват много заявки.

Но ако това не е опция, тогава можете да генерирате таблица с дати относително лесно в движение и да използвате това

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

РЕДАКТИРАНЕ

Ако трябва да изчислите разликата между две колони с дати, пак можете да използвате таблицата на календара си по следния начин:

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;

Пример за 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. Върнатият тип данни варира в зависимост от данните в таблицата

  2. Как да ускорите своя SQL сървър с помощта на мониторинг на производителността на базата данни

  3. Познайте връзките между всички таблици на базата данни в SQL Server

  4. Събиране на данни за производителността с помощта на инструмента SQLDiag | Отстраняване на проблеми с производителността на SQL Server -6

  5. Как да деактивирате CDC върху набор от таблици ИЛИ да деактивирате за всички таблици в база данни в SQL Server - урок за SQL Server