Sql 列出范围内的所有日期

Sql 列出范围内的所有日期,sql,sql-server,database,Sql,Sql Server,Database,我以前见过这样的问题,但无法得到有效的答案 我有两个栏目——startyear和endyear。我想创建一个从开始到结束的所有年份的列表。因此,如果这一行的开始年份是2010年,结束年份是2016年,我希望列表显示2010年、2011年、2012年等等 我是否必须在所有行中以某种方式获取最早的开始日期和最新的结束日期 SELECT StartYear, EndYear FROM TestYear 在存储过程中尝试类似的操作 SELECT * INTO #FileDates FROM (SE

我以前见过这样的问题,但无法得到有效的答案

我有两个栏目——startyear和endyear。我想创建一个从开始到结束的所有年份的列表。因此,如果这一行的开始年份是2010年,结束年份是2016年,我希望列表显示2010年、2011年、2012年等等

我是否必须在所有行中以某种方式获取最早的开始日期和最新的结束日期

 SELECT StartYear, EndYear
 FROM TestYear

在存储过程中尝试类似的操作

SELECT * INTO #FileDates
FROM (SELECT distinct year(startyear) as year from filename ) 
SELECT * INTO #FileDates2
    FROM (SELECT distinct year(endyear) as year from filename ) 

select distinct year from #FileDate, #FileDate2

您可能还想签出:

在存储过程中尝试类似的操作

SELECT * INTO #FileDates
FROM (SELECT distinct year(startyear) as year from filename ) 
SELECT * INTO #FileDates2
    FROM (SELECT distinct year(endyear) as year from filename ) 

select distinct year from #FileDate, #FileDate2

您可能还想签出:

使用递归cte来执行此操作

declare @startyear int = 2010; --or any other number or a select query
declare @endyear int = 2020; --or any other number or a select query
with years(yr) as 
(
 select @startyear
 union all
 select yr+1 from years where yr < @endyear
)
select * from years;

使用递归cte来执行此操作

declare @startyear int = 2010; --or any other number or a select query
declare @endyear int = 2020; --or any other number or a select query
with years(yr) as 
(
 select @startyear
 union all
 select yr+1 from years where yr < @endyear
)
select * from years;

可以使用递归CTE执行此操作:


可以使用递归CTE执行此操作:

样本数据

质疑

样本数据

质疑


您希望如何返回此列表?作为一张桌子?作为逗号分隔的列表?还有别的办法吗?请显示一些示例数据以说明您试图实现的目标。对不起,我希望它作为一个表返回,其中一列年份,每行为不同的年份。TestYear中有多少行?您希望如何返回此列表?作为一张桌子?作为逗号分隔的列表?还有别的办法吗?请展示一些示例数据来说明您试图实现的目标。抱歉,我希望它作为一个表返回,其中一列年份,每行为不同的年份。TestYear中有多少行?@ConradFrix在spt_值表中大约有2500个不同的值,如果生成的值超过2500个,则此代码将不足以生成2500*2500个数字,远远超过2500个。@ConradFrix no mate它在spt_值中有重复的值,无论如何,我更改了代码以使其更高效、更准确。@ConradFrix在spt_值表中大约有2500个不同的值,如果生成的值超过2500个,则此代码将不足以生成2500*2500个数字,因此交叉连接将生成2500*2500个数字,远远不止2500个。@ConradFrix no mate它在spt_值中有重复的值,无论如何,我更改了代码以使其更高效、更准确。这在大多数情况下都不起作用。他们希望在最早的开始日期和最晚的结束日期之间每年排一行。这根本不可能。你是对的,它只涵盖有数据的年份。这在大多数情况下都不起作用。他们希望在最早的开始日期和最晚的结束日期之间每年排一行。你说得对,它只涵盖有数据的年份。
WITH X AS (

Select MIN(StartYear) MinYear
      ,MAX(EndYear)   MaxYear
FROM @t
) 
Select TOP ((Select MaxYear FROM X) 
           - (Select MinYear FROM X) + 1)
    ROW_Number() Over (Order by (Select NULL)) 
    + (Select MinYear FROM X) -1 rn
FROM master..spt_values a 
         Cross Join master..spt_values b