DateS 和 Date BY SQL 之间的每个不同的日期

Every distinct Date between DateA and Date B -TSQL

我正在搜索类似日历的查询,返回“日期 A”和日期“A -49 天”之间的不同日期。

日期A是一个变量。如果我在周一到周日查看查询,它会给我回复

  1. 前一周星期日的日期
  2. 前一周星期日的日期
  3. 前一周前 2 周
  4. 前一周前 5 周

例如:我在“2022-01-23”开始查询

a_end: '2022-01-16' a_beginn: '2021-12-05' 和之间的每个日期 b_end:'2022-01-09' b_beginn: '2021-11-29' 和之间的每个日期 等等

您可以使用递归 CTE:

WITH T(d) AS (
  SELECT CAST('2022-01-01' AS date)
  UNION ALL
  SELECT DATEADD(day, -1, d)
  FROM T
  WHERE d >= DATEADD(day, -49, '2022-01-01')
)
SELECT d
FROM T
-- OPTION (MAXRECURSION 1000)

如果您有超过 100 天的生成时间,则需要设置 MAXRECURSION query hint 默认限制为 100(0 表示无限制)。不过,请注意此设置的无限循环。

您可以生成动态日历 table,如本例所示:

with FindPrevSunday as (
select 
  dateadd(week,datediff(week, '1900-01-07', getdate()), '1900-01-07') PrevSunday
),
JustFourRows as (
select 1 as x union all select 1 as x union all
select 1 as x union all select 1 as x
),
LotsOfRows as (
select Dte=dateadd(day, -Row_number() over (order by a.x)+1, (select PrevSunday from FindPrevSunday))
from 
JustFourRows a --4
cross Join
JustFourRows b --16
cross join  
JustFourRows c --64
cross join
JustFourRows d -- 256
) 
select Dte
from LotsOfRows
cross join
FindPrevSunday PrevS
where Dte between dateadd(day,-48, Prevs.PrevSunday) and PrevSunday 

'1900-01-07'为固定参考点;已知是星期天; datediff(week always brings whole/complete weeks; and we use the cross joins to quickly 'generate' rows corresponding to the dates in the calendar; 然后我们分配日期,然后过滤我们感兴趣的限制。这示例最多可生成 256 天,但您可以根据需要添加更多交叉联接。