如何在SQL Server中将日期与年份与没有年份的日期进行比较

时间:2014-10-25 15:53:31

标签: sql-server sql-server-2008 date reporting-services ssrs-2008

如果已经回答这个问题,我想道歉,但在20分钟的搜索中,我什么也没找到。我正在使用SQL Server Reporting Services(SSRS)和存储过程来创建带有查询的报告。

在此过程中,我有2个参数 - fromdatetodate,表示间隔。我必须比较所选行的日期,但我不必看一年。例如,当我选择15-feb-2014到2014年3月15日的间隔,并且其中一行具有值为25-feb-2000的日期列时,报告应显示它。当我们想要显示一个人的生日时,就会发生这种情况,从而忽略了这一年。

问题在于,如果我只是使用

WHERE date BETWEEN @fromdate AND @todate

它不会显示行,因为显然考虑了年份。

非常感谢帮助:)

2 个答案:

答案 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

enter image description here