我使用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'
如何获得所需的结果?
答案 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