我有一个滚动的4周(28天)日期模式,从过去的锚定日期开始。我需要知道最接近的先前模式开始日期相对于当前日期的内容。
例如:
锚定日期= 2013年6月30日星期一。如果今天的日期是2013年8月7日,那么我想要的日期是2013年7月29日。之前的模式开始日期是7月29日6月30日。下一个模式的开始日期是8月26日但是这是在今天的2013年8月7日之后。
希望有意义并感谢
答案 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