DateS 和 Date BY SQL 之间的每个不同的日期
Every distinct Date between DateA and Date B -TSQL
我正在搜索类似日历的查询,返回“日期 A”和日期“A -49 天”之间的不同日期。
日期A是一个变量。如果我在周一到周日查看查询,它会给我回复
- 前一周星期日的日期
- 前一周星期日的日期
- 前一周前 2 周
- 前一周前 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 天,但您可以根据需要添加更多交叉联接。
我正在搜索类似日历的查询,返回“日期 A”和日期“A -49 天”之间的不同日期。
日期A是一个变量。如果我在周一到周日查看查询,它会给我回复
- 前一周星期日的日期
- 前一周星期日的日期
- 前一周前 2 周
- 前一周前 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 天,但您可以根据需要添加更多交叉联接。