2011-09-27 6 views

Odpowiedz

1

Sprawdź to pytanie: Count work days between two dates

Istnieje kilka sposobów można wykorzystać odpowiedź na to pytanie dla twojego również.

+1

Odpowiedzi na to będzie naprawdę trudno przekonwertować na to pytanie. Również nie są naprawdę godni wszystkich punktów, które otrzymali. Lepsze odpowiedzi na to pytanie: 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. znaleźć tygodniu pierwszy poniedziałek przed wtorek @from.
  2. znaleźć tygodnia od pierwszego poniedziałku po @to
  3. odjąć tydzień
+0

+1 Działa świetnie. Jednak do tej pory nie można złamać formuły. Jest jasne, że '-6' i' -5' mogą łatwo być odpowiednio "1" i "2" lub jakikolwiek inny wtorek i odpowiednia (następna) środa. Zastanawiam się tylko, czy trafiłeś na właściwe liczby empirycznie, albo jakoś je obliczyłeś. –

+0

@AndriyM tak, -6 i -5 dają taki sam wynik jak 1 i 2, co utrudniłoby wyjaśnienie. Osiągnąłem wynik przez obliczenie i testowanie, nie otrzymałem prawidłowego wyniku kilka pierwszych razy. –

+0

@arjmand jeśli to rozwiązało twój problem, proszę przyjąć odpowiedź –

2

@ t-clausen.dk & Andrij M jak odpowiedzi na t-clausen.dks response and comments

zapytaniu wykorzystuje fakt, że 1900- 01-01 był poniedziałkiem. I 01.01.1900 to data 0.

select dateadd(day,0,0)

Drugi parametr do datediff -function jest StartDate.

Więc porównywania „1899-12-26” z @ aktualne i „1899-12-26” jest wtorek

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

samo o drugim terminie, który używa ten sam fakt.

W rzeczywistości można porównać z każdą znaną we wtorek i odpowiadającą środę (która nie jest w interwale czasu, który badasz).

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] 

Zasadniczo algorytm to "Wszystkie wtorki minus wszystkie środy".

8

Dziękuję t-clausen.dk, Uratował mnie kilka dni. Aby uzyskać żadnych wystąpień każdego dnia:

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 
Powiązane problemy