0

이 질문에 대한 답변이 아직되었지만 20 분이 지나면 사과를드립니다. SSRS (SQL Server Reporting Services) 및 저장 프로 시저를 사용하여 쿼리가 포함 된 보고서를 만듭니다.SQL Server에서 연도가없는 연도와 연도를 비교하는 방법

이 절차에서 나는 간격을 나타내는 2 개의 매개 변수 - fromdate 및 을가집니다. 선택한 행의 날짜를 비교해야하지만 올해는 볼 필요가 없습니다. 예를 들어 15-feb-2014에서 15-mar-2014 사이의 간격을 선택하고 행 중 하나에 값이 25-feb-2000 인 날짜 열이 있으면 보고서에 표시되어야합니다. 이것은 우리가 한 사람의 생일을 표시하여 연도를 무시할 때 발생할 수 있습니다.

문제는 그냥

WHERE date BETWEEN @fromdate AND @todate 

사용하는 경우 분명히 올해는 고려대로 행을 표시 할 것입니다.

도움이 크게 감사합니다 :)

+0

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

답변

1

당신이 쓸 수있는 곳이 같은 조항 뭔가 ... covered indexEventDate에 열이 다음 실행 계획이됩니다 경우

WHERE 
    (MONTH(DateColumn) >= MONTH(@fromdate) AND DAY(DateColumn) >= DAY(@fromdate)) 
AND 
    (MONTH(DateColumn) <= MONTH(@todate) AND DAY(DateColumn) <= DAY(@todate)) 
+0

감사합니다. 시도해 보겠습니다. –

+0

그래, 좋은 해결책이 아니란 걸 알았어. –

+0

'(MONTH (DateColumn) = MONTH (@fromdate) AND DAY (DateColumn)> = DAY (@fromdate) 또는 MONTH (DateColumn) = MONTH (@fromdate) AND (MONTH (DateColumn) = MONTH (@todate) AND DAY (DateColumn) <= 요일 (@ 날짜) 또는 MONTH (날짜 열)

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 

Index Seek :

enter image description here

관련 문제