根据锚定日期的模式计算日期

时间:2013-08-07 02:59:44

标签: sql sql-server date datetime

我有一个滚动的4周(28天)日期模式,从过去的锚定日期开始。我需要知道最接近的先前模式开始日期相对于当前日期的内容。

例如:

锚定日期= 2013年6月30日星期一。如果今天的日期是2013年8月7日,那么我想要的日期是2013年7月29日。之前的模式开始日期是7月29日6月30日。下一个模式的开始日期是8月26日但是这是在今天的2013年8月7日之后。

希望有意义并感谢

2 个答案:

答案 0 :(得分:1)

虽然我不是100%肯定我明白7月29日来自哪里,如果你想从锚定日期起28天检索最接近的日期,一种方法是使用递归CTE(虽然它可能有性能意义)。

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)

答案 1 :(得分:0)

我认为你的计算有点偏差。 28日/ 7月30日/ 8月25日/ 8月30日后28天。 无论如何,这是我的查询将返回28 / Jul,我相信这是正确的答案。

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