2011-09-27 10 views

Respuesta

1

Salida esta pregunta: Count work days between two dates

Hay algunas maneras que usted puede aprovechar la respuesta a esa pregunta por la tuya también.

+1

Las respuestas para eso serán realmente difíciles de convertir a esta pregunta. Además, no son realmente dignos de todos los puntos que recibieron. Mejores respuestas para esa pregunta aquí: 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. encontramos la semana del primer Lunes antes del martes en @from.
  2. encontramos la semana del primer lunes después de restar @Al
  3. las semanas
+0

+1 Funciona muy bien. Sin embargo, no se puede descifrar la fórmula hasta ahora. Está claro que '-6' y' -5' podrían ser fácilmente '1' y' 2' respectivamente o cualquier otro martes y el miércoles correspondiente (subsiguiente). Lo que me pregunto es si llegó a las cifras correctas solo empíricamente o de alguna manera las calculó. –

+0

@AndriyM sí, -6 y -5 producen el mismo resultado que 1 y 2, pero sería más difícil de explicar. Llegué al resultado calculando y probando, no obtuve el resultado correcto las primeras veces. –

+0

@arjmand si esto resolvió su problema, por favor acepte la respuesta –

2

@ t-clausen.dk & Andriy M como respuesta a t-clausen.dks response and comments

la consulta utiliza el hecho de que 1900- 01-01 fue un lunes. Y es la fecha 1900-01-01 0.

select dateadd(day,0,0)

El segundo parámetro en el datediff -función es startdate.

Así que usted está comparando '26/12/1899' con su @ actualizada y '26/12/1899' es un martes

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

mismo de la segunda fecha que utiliza el mismo hecho

De hecho, puede comparar con cualquier martes conocido y miércoles correspondiente (que no está en el intervalo de fechas que está investigando).

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] 

Básicamente el algoritmo es "Todos los martes menos todos los miércoles".

8

Gracias t-clausen.dk, Me salvó unos días. Para obtener ninguna de las instancias de cada día:

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 
Cuestiones relacionadas