我有一个具有以下结构的表:
ID:StartDate:EndDate
我想在每个ID的日期范围内显示所有日期。
例如
ID = 1: StartDate = 01/01/2018: EndDate = 03/01/2018
ID: 1 01/01/2018
ID: 1 02/01/2018
ID: 1 03/01/2018
我想我需要使用交叉连接,但我不确定如何为多行创建它?
答案 0 :(得分:0)
在标准SQL中,您可以使用递归CTE:
with recursive dates as (
select date '2018-01-01' as dte
union all
select dte + interval '1 day'
from dates
where dte < date '2018-01-03'
)
select dte
from dates;
确切的语法(无论是recursive
还是日期函数)在数据库中有所不同。并非所有数据库都支持此标准功能。
答案 1 :(得分:0)
这是SQL Server的CTE,语法有些不同:
declare @startdate date = '2018-01-01';
declare @enddate date = '2018-03-18';
with
dates as (
select @startdate as [date]
union all
select dateadd(dd, 1, [date]) from dates where [date] < @enddate
)
select [date] from dates
答案 2 :(得分:0)
现在只有一个id ..,
create table #dateTable(id int, col1 date, col2 date)
insert into #dateTable values(1,'05-May-2018','08-May-2018') ,(2,'05-May-2018','05-May-2018')
select *from #dateTable
with cte(start, ends) as(
select start = (select top 1 col1 from #dateTable), ends = (select top 1 col2 from #dateTable)
union all
select DATEADD(dd,1,start),ends from cte where start <> ends
)select start from cte option (maxrecursion 10)
我还在工作......我很快就会更新......!
答案 3 :(得分:0)
所以我最终使用了一个日期表,只是交叉引用
select *
from Date d
inner join WorkingTable w
on d.Date >= w.StartDate
and d.date < w.EndDate