2009-11-26 2 views
52

Как исключить значения в столбце DateTime, которые являются субботами или воскресеньями?Как исключить выходные дни в запросе SQL Server?

Например, учитывая следующие данные:

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 

это результат Я ищу:

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

Спасибо!

ответ

105

При работе с расчетами на день недели важно учитывать текущие настройки DATEFIRST. Этот запрос всегда корректно исключает выходные дни, используя @@DATEFIRST для учета любых возможных настроек в течение первого дня недели.

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

Хорошая утонченность: +1! :-) – gkrogers

+1

Удивительное спасибо! –

8

Попробуйте DATENAME() функции:

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

Предполагая, что вы используете SQL Server, используйте DATEPART с ВЕСОМ:

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

EDIT: Я должен отметить, что фактическое числовое значение возвращаемого по DATEPART (dw) определяется значением, установленным с помощью SET DATEFIRST:
http://msdn.microsoft.com/en-us/library/ms181598.aspx

+0

Возможна автоматическая обработка любых возможных настроек 'DATEFIRST'. См. Мой ответ для деталей. – LukeH

+0

Отличный совет: +1! :-) – gkrogers

2

Ответ зависит от буднего запуска вашего сервера создан, так что либо

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

если воскресенье первого дня недели для вашего сервера

или

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

если понедельник это первый день недели для вашего сервера

Комментарий, если у вас есть вопросы :-)

+0

Можно автоматически обрабатывать любые возможные настройки 'DATEFIRST'. См. Мой ответ для деталей. – LukeH

+0

Приятный один Люк, мне было интересно, как это сделать ... – Gausie

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

Это может быть проблематично. Запустите этот скрипт: 'set language italian; выберите DATENAME (WEEKDAY, '2015-01-01'); 'Результатом является' giovedì'. – HuBeZa

+2

Хорошая точка HuBeZa, для перевода дня на другой язык я бы запускал следующий 'SELECT * FROM sys.syslanguages' и найдите язык, который вы хотите перевести на – kevchadders

1

Вычислить Оставить рабочие дни в столбце таблицы в качестве значения по умолчанию - обновленный

Если вы используете SQL здесь есть запрос, который может помочь вам: http://gallery.technet.microsoft.com/Calculate...

-1

Попробуйте это код

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