2009-11-26 12 views
52

¿Cómo excluyo los valores en una columna DateTime que son sábados o domingos?¿Cómo excluyo los días de fin de semana en una consulta de SQL Server?

Por ejemplo, dados los siguientes datos:

date_created 
'2009-11-26 09:00:00' -- Thursday 
'2009-11-27 09:00:00' -- Friday 
'2009-11-28 09:00:00' -- Saturday 
'2009-11-29 09:00:00' -- Sunday 
'2009-11-30 09:00:00' -- Monday 

este es el resultado que estoy buscando:

date_created 
'2009-11-26 09:00:00' -- Thursday 
'2009-11-27 09:00:00' -- Friday 
'2009-11-30 09:00:00' -- Monday 

Gracias!

Respuesta

105

Cuando se trata de cálculos del día de la semana, es importante tener en cuenta la configuración actual de DATEFIRST. Esta consulta siempre excluirá correctamente los días de fin de semana, utilizando @@DATEFIRST para tener en cuenta cualquier configuración posible para el primer día de la semana.

SELECT * 
FROM your_table 
WHERE ((DATEPART(dw, date_created) + @@DATEFIRST) % 7) NOT IN (0, 1) 
+2

Bonito refinamiento: +1! :-) – gkrogers

+1

Awesome gracias! –

8

Pruebe la función DATENAME():

select [date_created] 
from table 
where DATENAME(WEEKDAY, [date_created]) <> 'Saturday' 
    and DATENAME(WEEKDAY, [date_created]) <> 'Sunday' 
10

Suponiendo que está utilizando SQL Server, utilice DATEPART con DW:

SELECT date_created 
FROM your_table 
WHERE DATEPART(dw, date_created) NOT IN (1, 7); 

EDIT: Debo señalar que el valor numérico real devueltos por DATEPART (dw) viene determinado por el valor establecido mediante SET DATEFIRST:
http://msdn.microsoft.com/en-us/library/ms181598.aspx

+0

Es posible manejar automáticamente cualquier configuración posible de 'DATEFIRST'. Ver mi respuesta para más detalles. – LukeH

+0

Excelente consejo: +1! :-) – gkrogers

2

La respuesta depende de una semana de inicio del servidor de configurar, así que o

SELECT [date_created] FROM table WHERE DATEPART(w,[date_created]) NOT IN (7,1) 

si el domingo es el primer día de la semana para su servidor

o

SELECT [date_created] FROM table WHERE DATEPART(w,[date_created]) NOT IN (6,7) 

si el lunes es el primer día de la semana para su servidor

Comente si tiene alguna pregunta :-)

+0

Es posible manejar automáticamente cualquier configuración posible de 'DATEFIRST'. Ver mi respuesta para más detalles. – LukeH

+0

Un buen Luke, me he estado preguntando cómo hacerlo ... – Gausie

17
SELECT date_created 
FROM your_table 
WHERE DATENAME(dw, date_created) NOT IN ('Saturday', 'Sunday') 
+1

Esto podría ser problemático. Ejecute este script: 'set language italian; seleccione DATENAME (WEEKDAY, '2015-01-01'); 'El resultado es' giovedì'. – HuBeZa

+2

Buen punto HuBeZa, para traducir el día a otro idioma, ejecutaría el siguiente 'SELECT * FROM sys.syslanguages' y busque el idioma que desea traducir a – kevchadders

-1

Prueba esto código

select (DATEDIFF(DD,'2014-08-01','2014-08-14')+1)- (DATEDIFF(WK,'2014-08-01','2014-08-14')* 2) 
Cuestiones relacionadas