TSQL比较日期范围

时间:2015-09-08 16:55:51

标签: sql-server-2008 datetime

DATA:

DECLARE @rundate datetime = GETDATE()

DECLARE @DatesTable TABLE (name varchar(200),STARTDATE datetime,ENDDATE datetime)
INSERT INTO @DatesTable VALUES('campaign1',GETDATE(),GETDATE()+10)

INSERT INTO @DatesTable
VALUES('campaign2',GETDATE()+11,GETDATE()+13)

对于上述数据,我有2个活跃的广告系列一个接一个地运行。 对于给定日期(rundate),我需要从@DatesTable中选择适用@rundate的一个有效广告系列。

基本上,要查看的结束日期取决于下一个广告系列的开始日期,并确定@rundate有效的广告系列并返回该结果。

如果未返回任何结果,则需要返回最后一个广告系列。

1 个答案:

答案 0 :(得分:2)

如果所有内容都被声明为CAST而不是date,那么您将有更轻松的时间(无datetime)。无论如何,试一试:

;WITH
    cte AS
    (
        SELECT  name, STARTDATE, ENDDATE,
                rn = ROW_NUMBER() OVER (ORDER BY ENDDATE DESC) 
        FROM    @DatesTable
        WHERE   CAST(STARTDATE AS date) <= CAST(@rundate AS date)
    )

SELECT  *
FROM    cte
WHERE   rn = 1

选择@rundate之前或之前开始的所有广告系列,并按ENDDATE降序排列。最后根据该订单获得最新的广告系列。