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有效的广告系列并返回该结果。
如果未返回任何结果,则需要返回最后一个广告系列。
答案 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
降序排列。最后根据该订单获得最新的广告系列。