如何按月和年过滤结果?

时间:2016-10-25 11:11:11

标签: 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

正如您所看到的,我将两个参数传递给上面的存储过程,以及那些用于过滤where子句中的结果的参数。

我的问题是我需要按月和年过滤结果。

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

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

根据存储过程,我会得到上述日期之间的结果。但是我需要从月初05和月末10获取行 i,e 结果应该相当于那些参数:

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

如何获得所需的结果?

4 个答案:

答案 0 :(得分:3)

您还可以使用EOMONTH功能

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

答案 1 :(得分:2)

试试这个: 在这里

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

答案 2 :(得分: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)

答案 3 :(得分: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