SQL Cross加入日期范围之间的所有日期

时间:2018-05-11 11:08:15

标签: sql sql-server-2012

我有一个具有以下结构的表:

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 

我想我需要使用交叉连接,但我不确定如何为多行创建它?

4 个答案:

答案 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