gpt4 book ai didi

tsql - 获取期间之间的日期

转载 作者:行者123 更新时间:2023-12-01 19:46:33 26 4
gpt4 key购买 nike

我有一个包含以下数据的表

periodID periostart periodend
1 01-01-2012 10-01-2012
2 11-01-2012 01-04-2012

我希望查询返回这样的内容。periodID日期

1        01-01-2012
1 02-01-2012
1 03-01-2012
etc.
1 09-01-2012
2 11-01-2012
2 12-01-2012
etc.
2 31-03-2012

因为我有大约 100,000 行包含句点,所以我想研究一个不会影响性能的解决方案(游标、循环)。是否可以在不使用游标或循环的情况下获得我想要的结果?

感谢参与。

到目前为止我得到了这个解决方案

create table #p (id int, periodstart smalldatetime, periodend smalldatetime );
insert into #p values
(1, '2012-01-01', '2015-01-10')
insert into #p values
(2, '2012-04-10', '2015-11-20');


SELECT TOP 366 --aprox one year
IDENTITY(INT,0,1) AS N
INTO #Tally
FROM Master.dbo.SysColumns sc1,
Master.dbo.SysColumns sc2



SELECT DATEADD(day, T.N, periodstart) AS [Date]
FROM #p
cross join #tally T
WHERE (T.N >= 0 AND T.N < DATEDIFF(day, periodstart, periodend))
ORDER BY [Date]

最佳答案

这里是:

create table #p (id int, periostart date, periodend date );
insert into #p values
(1, '20120101', '20120110'),
(2, '20120110', '20120120');


with cte as (
select
id, periostart as aDay
from
#p
union all
select
cte.id, dateadd( day, 1, cte.aDay) as aDay
from
#p
inner join
cte on #p.id = cte.id
where
cte.aDay < #p.periodend
)
select * from cte

结果:

id aDay          
-- -------------
1 2012-01-01 00:00:00
2 2012-01-10 00:00:00
...
2 2012-01-17 00:00:00
2 2012-01-18 00:00:00
2 2012-01-19 00:00:00
2 2012-01-20 00:00:00
1 2012-01-02 00:00:00
1 2012-01-03 00:00:00
...
1 2012-01-08 00:00:00
1 2012-01-09 00:00:00
1 2012-01-10 00:00:00

说明:我用CTE递归获取新日期,在当前日期的基础上增加 1 天以限制结束时间。困难的是在递归连接中获取最后生成的日期,我用 OVER 解决了这个问题条款。我认为这是一个很好的查询。

根据 OP 评论编辑

我已经发布了这种方法,因为 OP 要求没有循环和游标的解决方案。我不知道还有什么其他方法可以编写没有循环或游标的 sql 语句。

此外,我认为生成日期的正确方法是使用内循环或 Itzik 风格的交叉连接将光标置于周期表上

关于tsql - 获取期间之间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com