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

T-SQL lấy số ngày làm việc giữa 2 ngày

Xin vui lòng, xin vui lòng, xin vui lòng sử dụng một bảng lịch. SQL Server không biết gì về các ngày lễ quốc gia, các sự kiện của công ty, thảm họa thiên nhiên, v.v. Một bảng lịch khá dễ xây dựng, chiếm dung lượng cực kỳ nhỏ và sẽ nằm trong bộ nhớ nếu nó đủ tham chiếu.

Đây là một ví dụ tạo một bảng lịch với 30 năm ngày (2000 -> 2029) nhưng chỉ yêu cầu 200 KB trên đĩa (136 KB nếu bạn sử dụng tính năng nén trang). Điều đó gần như được đảm bảo sẽ ít hơn mức bộ nhớ được cấp để xử lý một số CTE hoặc bộ khác trong thời gian chạy.

CREATE TABLE dbo.Calendar
(
  dt DATE PRIMARY KEY, -- use SMALLDATETIME if < SQL Server 2008
  IsWorkDay BIT
);

DECLARE @s DATE, @e DATE;
SELECT @s = '2000-01-01' , @e = '2029-12-31';

INSERT dbo.Calendar(dt, IsWorkDay)
  SELECT DATEADD(DAY, n-1, '2000-01-01'), 1 
  FROM
  (
    SELECT TOP (DATEDIFF(DAY, @s, @e)+1) ROW_NUMBER() 
      OVER (ORDER BY s1.[object_id])
      FROM sys.all_objects AS s1
      CROSS JOIN sys.all_objects AS s2
  ) AS x(n);

SET DATEFIRST 1;

-- weekends
UPDATE dbo.Calendar SET IsWorkDay = 0 
  WHERE DATEPART(WEEKDAY, dt) IN (6,7);

-- Christmas
UPDATE dbo.Calendar SET IsWorkDay = 0 
  WHERE MONTH(dt) = 12
  AND DAY(dt) = 25
  AND IsWorkDay = 1;

-- continue with other holidays, known company events, etc.

Bây giờ truy vấn bạn đang theo dõi khá đơn giản để viết:

SELECT COUNT(*) FROM dbo.Calendar
  WHERE dt >= '20130110'
    AND dt <  '20130115'
    AND IsWorkDay = 1;

Thông tin thêm về bảng lịch:

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxvacy-calendar-table.html

Thông tin thêm về tổ máy phát điện không có vòng lặp:

http://www.sqlperformance.com/tag/date-ranges

Ngoài ra, hãy cẩn thận với những điều nhỏ nhặt như dựa vào đầu ra tiếng Anh của DATENAME . Tôi đã thấy một số ứng dụng bị hỏng do một số người dùng có cài đặt ngôn ngữ khác và nếu bạn đang dựa vào WEEKDAY hãy chắc chắn rằng bạn đã đặt DATEFIRST của mình thiết lập thích hợp ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL SERVER:Nhận tổng số ngày giữa hai ngày

  2. Sự khác biệt giữa Người dùng và Đăng nhập trong SQL Server

  3. Một cái nhìn logic không tưởng tượng về các quy ước đặt tên máy chủ SQL

  4. Bảng sổ cái cơ sở dữ liệu SQL Server Azure / 2022 từ Linux.

  5. Làm cách nào để hiển thị cấu trúc bảng trong truy vấn SQL Server?