Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tính toán các ngày để loại trừ các ngày cuối tuần (Thứ Hai đến Thứ Sáu) trong SQL Server

Tôi luôn đề xuất Bảng lịch , thì bạn có thể chỉ cần sử dụng:

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

Vì SQL không có kiến ​​thức về các ngày lễ, chẳng hạn như số ngày trong tuần giữa hai ngày không phải lúc nào cũng đại diện cho số ngày làm việc. Đây là lý do tại sao một bảng lịch là bắt buộc đối với hầu hết các cơ sở dữ liệu. Chúng không tốn nhiều bộ nhớ và đơn giản hóa rất nhiều truy vấn.

Nhưng nếu đây không phải là một tùy chọn thì bạn có thể tạo một bảng ngày tháng tương đối dễ dàng và sử dụng nó

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

CHỈNH SỬA

Nếu bạn cần tính toán sự khác biệt giữa hai cột ngày, bạn vẫn có thể sử dụng bảng lịch của mình như vậy:

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;

Ví dụ trên 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. Làm thế nào để SQL Server quyết định định dạng cho chuyển đổi ngày giờ ngầm định?

  2. 3 cách liệt kê tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu SQL Server

  3. Truy xuất ID của bản ghi đã chèn:PHp &MS SQL SERVER

  4. Làm thế nào để chuyển đổi varchar thành datetime trong T-SQL?

  5. SQL Server Parallel Backup Restore -2