2015-02-06 4 views
0

У меня есть запрос (вставленный ниже), и я хотел бы сделать так, чтобы людям не нужно обновлять заполненный диапазон дат. Я бы хотел, чтобы он автоматически получал результаты за последний месяц. Например, если он запущен в феврале, он даст мне результаты для всех завершенных элементов, соответствующих моим критериям за январь. Может ли кто-нибудь подумать о том, как это сделать?Ключевое слово для «Последний месяц» в SQL Server 2008

select External_ID__c, 
     Ewrk_Tracking_Number__c, 
     PIF_Branch_Name, 
     Distribution_Branch_Name, 
     Transaction_Type__C, 
     submitter_date__c, Completed_Date__C, 
     COUNT(External_ID__c) 
from Business_Solutions_D.dbo.Reporting_SalesForce_AspireBaseData 
where PIF_Branch_Code = 977 
    and Completed_Date__C >= '2015-01-01' 
    and Completed_Date__C < '2015-02-01' 
    and Delete_Flag__C = 'FALSE' 
group by External_ID__c, 
     Ewrk_Tracking_Number__c, 
     PIF_Branch_Name, 
     Distribution_Branch_Name, 
     Transaction_Type__C, 
     submitter_date__c, 
     Completed_Date__C 

ответ

0

Если вы имеете в виду в прошлом месяце до этого, вы можете сделать это в два этапа: первый, найти первый день текущего месяца

@firstDayOfThisMonth = DATEADD(day, DAY(GETDATE())-1, GETDATE()) 

затем вычесть один месяц:

@firstDayOfLastMonth = DATEADD(month, -1, @firstDayOfThisMonth) 

Тогда ваш запрос будет:

and Completed_Date__C >= @firstDayOfLastMonth 
and Completed_Date__C < @firstDayOfThisMonth 

Другим способом было бы запросить, где разница (в месяцах) между Completed_Date__C и текущей датой является 1:

and DATEDIFF(Completed_Date__C, GETDATE()) = 1 
0

Вы можете сделать это с датой арифметике. Один трюк, чтобы получить первую дату месяца, - это вычесть текущий день месяца с даты и добавить один день. SQL Server позволяет вам делать это с помощью + и - вместо dateadd(), по значению datetime. Конечно, вам нужно также удалить компонент времени (используя cast(as date)).

Логика выглядит следующим за текущий месяц:

where Completed_Date__C >= cast(getdate() - day(getdate()) + 1 as date) and 
     Completed_Date__C < dateadd(month, 1, cast(getdate() - day(getdate()) + 1 as date)) 

И как это за предыдущий месяц:

where Completed_Date__C >= dateadd(month, -1, cast(getdate() - day(getdate()) + 1 as date)) and 
     Completed_Date__C < cast(getdate() - day(getdate()) + 1 as date) 

Это приятное свойство, что она является sargeable в качестве исходного кода , поэтому он будет использовать индекс в столбце, если это необходимо.

+0

Вы, ребята, потрясающие! Спасибо огромное! Все они, похоже, работают достаточно хорошо. –

2

В прошлом месяце ключевое слово отсутствует. Вы должны положить это в свои предикаты.

Вот пример того, как получить значения даты для этого.

select dateadd(MONTH, datediff(MONTH, 0, GETDATE()), 0) as BeginningOfThisMonth 
select dateadd(MONTH, datediff(MONTH, 0, GETDATE()) - 1, 0) as BeginningOfPreviousMonth 

Если вы хотите увидеть несколько других подпрограмм, здесь вы найдете отличное сообщение в блоге с немалыми из них. http://www.sqlservercentral.com/blogs/lynnpettis/2009/03/25/some-common-date-routines/

0

Вам просто нужно, чтобы у него была математика для вычисления даты.

--Go to last day of prev month - 'Day' to account for varying month day counts 
and Completed_Date__C >= GETDATE() - DATEPART(DAY, GETDATE()) - DATEPART(DAY, GETDATE() - DATEPART(DAY, GETDATE())) + 1 
and Completed_Date__C < GETDATE() - DATEPART(DAY, GETDATE()) + 1 

Когда вы делаете добавления в DateTimes + integer, это предполагает добавление на день.

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