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

Truy vấn SQL Server để lấy số ngày làm việc giữa 2 ngày, không bao gồm ngày lễ

create table MyTable
(
 start_date date not null,
 end_date date not null,
 code int not null
)
GO

create table HolidayDates
(
   holydayDate date not null,
   holydayDescription varchar(100) not null
)
GO

insert into MyTable
values
 ('2018-12-25','2019-01-01',101)
,('2018-12-01','2019-01-31',102)
,('2018-12-24','2019-01-02',103)
GO

insert into HolidayDates
values
 ('2018-12-25', 'xmas')
,('2019-01-01', 'Reveillon')
GO

Trong truy vấn dưới đây, bạn có thể thấy cách các cột được tính toán.

[các ngày lễ (không phải cuối tuần)]: lấy mẫu tất cả các ngày thánh, bảng của bạn cũng không phải là ngày cuối tuần (vì vậy chúng không được tính hai lần).

cuối tuần: nhận các ngày cuối tuần trong kỳ.

Phần còn lại, các cột có thể tự giải thích

Tuyên bố từ chối trách nhiệm , bạn có thể đơn giản hóa điều này một chút, đó chỉ là một truy vấn ví dụ về cách sử dụng

DATEPART

DATEDIFF

DATNAME

select 
  datediff(day, mt.start_date, mt.end_date) as [total days], 
  (
    select 
      count(*) 
    from 
      HolidayDates hd 
    where 
      hd.holydayDate between mt.start_date 
      and mt.end_date 
      and DATEPART(WEEKDAY, hd.holydayDate) between 2 
      and 6
  ) as [holydays (not weekends) ], 
  (
    select 
      (
        datediff(wk, mt.start_date, mt.end_date) * 2
      ) +(
        case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
      ) +(
        case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
      )
  ) as weekends, 
  case when datediff(day, mt.start_date, mt.end_date) -(
    select 
      (
        datediff(wk, mt.start_date, mt.end_date) * 2
      ) +(
        case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
      ) +(
        case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
      )
  ) -(
    select 
      count(*) 
    from 
      HolidayDates hd 
    where 
      hd.holydayDate between mt.start_date 
      and mt.end_date 
      and DATEPART(WEEKDAY, hd.holydayDate) between 2 
      and 6
  ) > 3 then 0 --> this need to exclude weekend and holidays
  when mt.code = 1 then 1 when mt.code = 2 then 2 else 3 end as mycolumn 
from 
  MyTable mt

QUAY LẠI

total days  holydays (not weekends) weekends    mycolumn
----------- ----------------------- ----------- -----------
7           2                       2           3
61          2                       18          0
9           2                       2           0

(3 row(s) affected)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng BINARY_CHECKSUM (*) với nhiều bảng

  2. Thay thế giá trị null bằng giá trị có sẵn trước đó trong truy vấn máy chủ SQL Hàng

  3. Cơ sở dữ liệu hệ thống SQL Server - Khái niệm cơ bản

  4. Trợ giúp với truy vấn SQL phức tạp (rất nhiều THAM GIA?)

  5. Bảng tạm thời cục bộ và toàn cầu - Khi nào sử dụng cái gì?