2015-05-27 2 views
1

Я создаю хранимую процедуру SQL-сервера, которая выполняет большую фильтрацию на основе текущей недели. Вместо того, чтобы передавать дату начала и окончания, я прохожу за одну дату и используя Datepart(), чтобы отфильтровать неделю.Datepart() есть ли способ использовать переменную для интервала datepart

Where DATEPART(WEEK, cd.TurninDate) = DATEPART(WEEK, @StartDate) 
     and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate) 

Стараясь топ быть активным, я могу видеть менеджеры просят, чтобы это было работать ежемесячно или ежеквартально, а также еженедельно. Я бы предпочел не иметь сохраненный Proc для каждой версии, если я могу помочь. Я хочу передать частоту и дату, но она не работает.

Я пробовал:

Where DATEPART(@Freq, cd.TurninDate) = DATEPART(@Freq, @StartDate) 
     and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate) 

, но я получаю сообщение об ошибке на @Freq не признается в качестве интервала.

Кто-нибудь знает способ, которым я могу обойти это?

+0

Пропустите даты начала и окончания. Дата начала и продолжительность (количество дней). Фильтрация в том, как вы это делаете, не может использовать index => она медленна на больших таблицах. –

+0

Мой менеджер, который является полу-SQL-грамотным, будет запускать это, поэтому я хочу сделать его максимально простым. Моя цель состояла в том, чтобы позволить ему ввести текущую дату (или любую дату предыдущей недели) и получить номера полной недели. Я не хочу, чтобы он искал первую дату недели или (когда он расширялся только за неделю) выяснял, сколько дней в месяце или квартале. К счастью, никогда не будет большого количества записей. –

ответ

4

Там нет никакого способа, чтобы использовать переменную, но вы можете работать вокруг него:

case 
when @part = 'YEAR' THEN DATEPART(YEAR, cd.TurninDate) 
when @part = 'WEEK' THEN DATEPART(WEEK, cd.TurninDate) 
... 
END 

Конструкция языка SQL/T-SQL отсутствует, как вы можете видеть.

+0

спасибо, что это именно то, что я искал. Не могу поверить, что я сам не думал об этом, потому что я сделал подобное раньше, не просто с датами. –

0

Информация MSDN является довольно ясно

DatePart Является частью даты (даты или времени), для которых целое число будет возвращено. В следующей таблице перечислены все допустимые аргументы datepart. переменные, определяемые пользователем эквиваленты являются недопустимыми

https://msdn.microsoft.com/en-us/library/ms174420.aspx

Но, чтобы обойти это, вы можете создать динамический SQL и заполнить в этой части с переменной.

select datepart(year,GETDATE()) 

declare @DateType varchar(max); 
set @DateType = 'YEAR'; 
declare @datemanip varchar(max); 
set @datemanip = 'select datepart(' + @DateType + ',GETDATE())'; 
execute(@datemanip); 

Оба эти утверждения дадут тот же результат. Затем вы можете поместить это в свою хранимую процедуру и передать параметр @DateType в качестве параметра.

+0

Спасибо, но часть даты является частью предложения where, и я НЕ хочу, чтобы каждый запрос выполнял динамический запрос. некоторые из них довольно сложны. –

 Смежные вопросы

  • Нет связанных вопросов^_^