2011-09-27 14 views

Trả lời

1

Kiểm tra câu hỏi này: Count work days between two dates

Có một vài cách để bạn có thể tận dụng các câu trả lời cho câu hỏi đó cho bạn là tốt.

+1

Các câu trả lời cho điều đó sẽ rất khó để chuyển đổi sang câu hỏi này. Ngoài ra họ không thực sự xứng đáng với tất cả những điểm họ nhận được. Câu trả lời hay hơn cho câu hỏi đó tại đây: http://stackoverflow.com/questions/6704905/numbers-of-weekdays-in-a-date-range-in-tsql –

5
declare @from datetime= '9/20/2011' 
declare @to datetime = '9/28/2011' 

select datediff(day, -6, @to)/7-datediff(day, -5, @from)/7 
  1. tìm ra tuần của thứ hai đầu tiên trước khi thứ ba trong @from.
  2. tìm ra tuần của thứ Hai đầu tiên sau khi @to
  3. trừ những tuần
+0

+1 Hoạt động tuyệt vời. Không thể crack công thức cho đến nay, mặc dù. Rõ ràng là '-6' và' -5' có thể dễ dàng là '1' và' 2' tương ứng hoặc bất kỳ thứ ba nào khác và thứ tư tương ứng (tiếp theo) thứ tư. Điều tôi đang băn khoăn là liệu bạn có nhận được những con số đúng theo kinh nghiệm hay chỉ bằng cách nào đó bạn tính toán chúng. –

+0

@AndriyM có, -6 và -5 mang lại kết quả tương tự như 1 và 2 sẽ làm, điều đó sẽ khiến cho việc giải thích khó hơn. Tôi đã đạt được kết quả bằng cách tính toán và kiểm tra, không nhận được kết quả chính xác trong vài lần đầu tiên. –

+0

@arjmand nếu điều này giải quyết được vấn đề của bạn, vui lòng chấp nhận câu trả lời –

2

@ t-clausen.dk & Andriy M như đối phó với t-clausen.dks response and comments

Truy vấn sử dụng thực tế là 1900- 01-01 là thứ hai. Và 1900-01-01 là ngày 0.

select dateadd(day,0,0)

Tham số thứ hai vào datediff -function là STARTDATE.

Vì vậy, bạn đang so sánh '1899/12/26' với @ của bạn để cập nhật và '1899/12/26' là một thứ ba

select datename(dw,dateadd(day, 0, -6)), datename(dw, '1899-12-26')

Cùng một điều về ngày thứ hai mà sử dụng cùng một thực tế.

Như một vấn đề của thực tế, bạn có thể so sánh với bất kỳ ngày thứ ba đã biết và thứ tư tương ứng (không phải là trong khoảng thời gian bạn đang điều tra).

declare @from datetime= '2011-09-19' 
declare @to datetime = '2011-10-15' 

select datediff(day, '2011-09-13', @to)/7-datediff(day, '2011-09-14', @from)/7 as [works] 
     ,datediff(day, '2011-10-18', @to)/7-datediff(day, '2011-10-19', @from)/7 as [works too] 
     ,datediff(day, '2011-09-27', @to)/7-datediff(day, '2011-09-28', @from)/7 as [dont work] 

Về cơ bản, thuật toán là "Tất cả các ngày thứ Ba trừ tất cả các ngày thứ Tư".

8

Cảm ơn bạn t-clausen.dk, Đã lưu tôi vài ngày. Để không có trường hợp nào trong mỗi ngày:

declare @from datetime= '3/1/2013' 
declare @to datetime = '3/31/2013' 


select 
datediff(day, -7, @to)/7-datediff(day, -6, @from)/7 AS MON, 
datediff(day, -6, @to)/7-datediff(day, -5, @from)/7 AS TUE, 
datediff(day, -5, @to)/7-datediff(day, -4, @from)/7 AS WED, 
datediff(day, -4, @to)/7-datediff(day, -3, @from)/7 AS THU, 
datediff(day, -3, @to)/7-datediff(day, -2, @from)/7 AS FRI, 
datediff(day, -2, @to)/7-datediff(day, -1, @from)/7 AS SAT, 
datediff(day, -1, @to)/7-datediff(day, 0, @from)/7 AS SUN 
Các vấn đề liên quan