2016-10-25 6 views
2

Я использую SQL Server 2012.Как фильтровать результат только по месяцам и годам?

Я хранимую prcedure:

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 

    @DateFrom date, 
    @DateTo date 

AS 
BEGIN 
    SET NOCOUNT ON; 
    select * 
    from Clients 
    WHERE DateReview between (@DateFrom) and (@DateTo) 
END 

Как вы можете видеть, что я передать два параметра хранимой процедуры выше, и те параметры, которые я использовать для фильтрации результатов в ИНЕКЕ.

Моя проблема заключается в том, что мне нужно фильтровать результат только по месяцам и годам.

Например, если я прошел эти параметры:

@DateFrom date = '2016-05-15' , 
@DateTo date = '2016-10-09' 

В соответствии с хранимой процедурой я получить результат между датами above.But мне нужно получить строки с начала месяца 05 и в конце месяца 10 , е результат должен быть эквивалентен тем Params:

@DateFrom date = '2016-05-01' 
@DateTo date = '2016-10-31' 

Как я могу получить желаемый результат?

ответ

3

Вы также можете использовать функцию EOMONTH

select * 
    from Clients 
    WHERE DateReview between DATEADD(DAY,1,EOMONTH(@DateFrom,-1)) and EOMONTH(@DateTO) 
+0

Зачем мне -1? – Michael

+0

-1 - целочисленное выражение, указывающее количество месяцев для добавления или вычитания в @DateFrom. Дополнительные сведения см. На странице https://msdn.microsoft.com/en-in/library/hh213020(v=sql.110).aspx. – Buddi

0

Вот один из способов:

select * 
from Clients 
where DateReview >= dateadd(day, 1 - day(@DateFrom), @DateFrom) AND 
     DateReview < dateadd(month, 1, dateadd(day, 1 - day(@DateTo), @DateTo)) 

Этот метод позволяет запрос, чтобы сделать использование индекса на DateReview. Вы также можете сделать это так:

where year(DateReview) * 100 + month(DateReview) 
      between year(@DateFrom) * 100 + month(@DateFrom) and 
        year(@DateTo) * 100 + month(@DateTo) 
2

Попробуйте это: Здесь

DATEADD(dd,-(DAY(@DateFrom)-1),@DateFrom) это даст месяцев в дате начала IE '2016-05-01' И DATEADD(dd,-(DAY(DATEADD(mm,1,@DateTo))),DATEADD(mm,1,@DateTo)) даст месяц дата окончания т.е. '2016-10-31'

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 

@DateFrom date, 
@DateTo date 

AS 
BEGIN 
    SET NOCOUNT ON; 
    SET @DateFrom = DATEADD(dd,-(DAY(@DateFrom)-1),@DateFrom) 
    SET @DateTo = DATEADD(dd,-(DAY(DATEADD(mm,1,@DateTo))),DATEADD(mm,1,@DateTo)) 
    Updated ---^ 
select * 
from Clients 
WHERE DateReview between (@DateFrom) and (@DateTo) 
END 
0

Вы можете использовать функцию EOMONTH()

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 

    @DateFrom date, 
    @DateTo date 

AS 
BEGIN 
    SET NOCOUNT ON; 
    select * 
    from Clients 
    WHERE DateReview between Dateadd(d,1,EOMonth(@DateFrom,-1)) and EOMonnth(@DateTo) 
END 
Смежные вопросы