如果已经回答这个问题,我想道歉,但在20分钟的搜索中,我什么也没找到。我正在使用SQL Server Reporting Services(SSRS)和存储过程来创建带有查询的报告。
在此过程中,我有2个参数 - fromdate
和todate
,表示间隔。我必须比较所选行的日期,但我不必看一年。例如,当我选择15-feb-2014到2014年3月15日的间隔,并且其中一行具有值为25-feb-2000的日期列时,报告应显示它。当我们想要显示一个人的生日时,就会发生这种情况,从而忽略了这一年。
问题在于,如果我只是使用
WHERE date BETWEEN @fromdate AND @todate
它不会显示行,因为显然考虑了年份。
非常感谢帮助:)
答案 0 :(得分:1)
你可以写下你的where子句......
WHERE
(MONTH(DateColumn) >= MONTH(@fromdate) AND DAY(DateColumn) >= DAY(@fromdate))
AND
(MONTH(DateColumn) <= MONTH(@todate) AND DAY(DateColumn) <= DAY(@todate))
答案 1 :(得分:0)
CREATE TABLE dbo.Events(
EventID INT IDENTITY(1,1) PRIMARY KEY,
EventDate DATE NOT NULL,
[Description] NVARCHAR(100) NOT NULL
);
GO
-- This index is neccesary in order to get [Index] Seek
CREATE INDEX IX_Events_EventDate
ON dbo.Events (EventDate)
-- INCLUDE ([Description], ...)
GO
INSERT dbo.Events VALUES ('2000-01-25', 'X')
INSERT dbo.Events VALUES ('2000-02-25', 'Y')
INSERT dbo.Events VALUES ('2000-03-25', 'Z')
INSERT dbo.Events VALUES ('2014-01-25', 'A')
INSERT dbo.Events VALUES ('2014-02-25', 'B')
INSERT dbo.Events VALUES ('2014-03-25', 'C');
GO
CREATE TABLE dbo.Numbers (Num INT IDENTITY(1,1) PRIMARY KEY);
GO
-- It generates all numbers between 1 and 1000
INSERT dbo.Numbers
DEFAULT VALUES
GO 1000
-- My proposal / solution
DECLARE @FromMonth TINYINT, @FromDay TINYINT
DECLARE @ToMonth TINYINT, @ToDay TINYINT
SELECT
@FromMonth = 2, @FromDay = 15,
@ToMonth = 3, @ToDay = 15;
SELECT ev.EventID, ev.EventDate
FROM
(
SELECT StartDate = DATEADD(DAY, @FromDay - 1, DATEADD(MONTH, @FromMonth - 1, DATEADD(YEAR, 99 + n.Num, '19000101'))),
EndDate = DATEADD(DAY, @ToDay - 1, DATEADD(MONTH, @ToMonth - 1, DATEADD(YEAR, 99 + n.Num, '19000101')))
FROM dbo.Numbers n
WHERE n.Num <= 15 -- It generates all intervals from 2000 to 2014
-- You should change 15 with a propper values (ex. you could compute this values thus: 2014 - 2000 + 1)
-- If you want all intervals from 1990 to 2014 you should use (1) 89 + n.Num and (2) n.Num <= 25
) intervals
INNER JOIN dbo.[Events] ev ON ev.EventDate >= intervals.StartDate AND ev.EventDate <= intervals.EndDate
如果EventDate
列上有covered index,则执行计划将包含Index Seek
: