2015-09-08 260 views
0

DATA:TSQL比較日期範圍

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)我需要選擇一個有效的競選該@rundate適用從@DatesTable。

基本上結束日期看取決於下一個活動的開始日期,並找出爲其競選@rundate是有效的,並且結果返回。

如果沒有返回結果,那麼最後一次競選需要返回。

+0

你的所有列'datetime'。我們應該忽略時間組件嗎? –

+0

是 - 時間總是將是00:00:00.000 –

+0

如果你需要知道,如果記錄在表中的運動@@ DatesTable是在特定日期(這是擺在@@ rundate變量)運行? – ahPo

回答

2

如果一切聲明爲date而不是datetime,那麼您將有一個更容易的時間(沒有CAST)。總之,試試這個:

;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遞減排序。最後它根據該訂單獲得最新的廣告系列。