2013-08-07 157 views
0

我從過去的錨定日期開始滾動4周(28天)的日期模式。我需要知道最近的模式開始日期是相對於當前日期。根據錨定日期的模式計算日期

例如:

錨日期=週一6月30日2013年如果今天的日期是2013年8月7日那我想返回的日期是7月29日2013年以前啓動模式日期是6月30日,7月29日的下一模式起始日期是8月26日,但是這是8月7日2013年

希望今天的日期是有道理的,並感謝後

+1

我有點困惑 - 如果錨定數據是6月30日,不應該下一個日期是7月28日(然後8月25日) - 驚變28天? – sgeddes

回答

1

雖然我不是100%肯定我明白的地方7月29日來自,如果你想要從錨定日期起28天內檢索最近的日期,一種方法是使用遞歸CTE(儘管它可能有一個perfor意義含義)。

declare @anchor datetime 
set @anchor = '6/30/2013' 

;with cte as (
    select @anchor dt 
    union all 
    select dateadd(day, 28, dt) dt 
    from cte 
    where dt <= dateadd(day, -28, '8/7/2013') 
) 
select max(dt) from cte 

或許更簡單的解決辦法是使用datediff還有:

declare @anchor datetime 
set @anchor = '6/30/2013' 

select dateadd(day, 28 * (datediff(day, @anchor, getDate())/28), @anchor) 
+0

對不起,在發佈基本相同的解決方案之前,我沒有看到您的答案。我會+1你的答案,因爲這是最早的答案。 –

0

我認爲你的計算有點不合適。 28/7月30日之後的28天,然後是8月25日。 無論如何,這裏是我的查詢將返回28/7月,我相信這是正確的答案。

WITH my_date AS 
    (SELECT CAST('30/Jun/2013' AS DATETIME)AS the_date 
    UNION ALL 
    SELECT dateadd(day,28,the_date)AS the_date 
    FROM my_date 
    WHERE my_date.the_date <= dateadd(day,-28,getdate()) 
    ) 
SELECT max(the_date) 
FROM my_date 

http://sqlfiddle.com/#!6/d41d8/6267