Sql server 如何仅按月份和年份筛选结果?

Sql server 如何仅按月份和年份筛选结果?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我使用SQL SERVER 2012 我已存储了以下文件: 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 如您所见,我将两个参数传递给上面的存储过程,这

我使用SQL SERVER 2012

我已存储了以下文件:

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
如您所见,我将两个参数传递给上面的存储过程,这些参数用于在where子句中过滤结果

我的问题是,我只需要按月份和年份过滤结果

例如,如果我已传递这些参数:

@DateFrom date = '2016-05-15' ,
@DateTo date = '2016-10-09'
根据存储过程,我将在上述日期之间获得结果。但我需要从月初
05
和月底10I,e获取行。结果应与以下参数等效:

@DateFrom date = '2016-05-01'
@DateTo date = '2016-10-31'
我怎样才能得到想要的结果?

这里有一种方法:

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

DATEADD(dd,-(DAY(@DateFrom)-1),@DateFrom)
这将给出几个月的开始日期,即
'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

您还可以使用
EOMONTH
功能

 select * 
    from Clients 
    WHERE DateReview between DATEADD(DAY,1,EOMONTH(@DateFrom,-1) ) and EOMONTH(@DateTO) 
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
可以使用EOMonth()函数

 select * 
    from Clients 
    WHERE DateReview between DATEADD(DAY,1,EOMONTH(@DateFrom,-1) ) and EOMONTH(@DateTO) 
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

为什么需要-1?-1是一个整数表达式,指定要向@DateFrom添加或减去的月数。更多的访问。