我有一个从过去的锚定日期开始的滚动 4 周(28 天)日期模式。我需要知道最近的上一个模式开始日期相对于当前日期是多少。
例如:
锚定日期 = 2013 年 6 月 30 日星期一。如果今天的日期是 2013 年 8 月 7 日,那么我希望返回的日期是 2013 年 7 月 29 日。以前的模式开始日期是 6 月 30 日,7 月 29 日。下一个模式开始日期是 8 月 26 日,但那是之后今天的日期是 2013 年 8 月 7 日。
希望这是有道理的,谢谢
我有一个从过去的锚定日期开始的滚动 4 周(28 天)日期模式。我需要知道最近的上一个模式开始日期相对于当前日期是多少。
例如:
锚定日期 = 2013 年 6 月 30 日星期一。如果今天的日期是 2013 年 8 月 7 日,那么我希望返回的日期是 2013 年 7 月 29 日。以前的模式开始日期是 6 月 30 日,7 月 29 日。下一个模式开始日期是 8 月 26 日,但那是之后今天的日期是 2013 年 8 月 7 日。
希望这是有道理的,谢谢
虽然我不是 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)
我觉得你的计算有点不对劲。6 月 30 日后 28 天,7 月 28 日和 8 月 25 日。无论如何,这是我的查询,它将返回 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