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
Index Seek
:
2 가지 가능한 솔루션을 얻은 후에도 복잡한 논리를 작성하는 것보다 쉬운 방법이 있는지 궁금합니다. 올해를 무시하고 날짜 비교를 수행하는 것이 얼마나 힘들지는 않습니다. –