2013-08-07 124 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