Sql server 如何列出两个日期之间的所有日期

Sql server 如何列出两个日期之间的所有日期,sql-server,stored-procedures,Sql Server,Stored Procedures,我希望在SQL Server存储过程中列出两个日期之间的日期 例如: Date1: 2015-05-28 Date2: 2015-05-31 结果: 2015-05-29 2015-05-30 如何计算两个给定日期之间的所有日期 关于,创建一个执行以下操作的存储过程: declare @startDate date; declare @endDate date; select @startDate = '20150528'; select @endDate = '20150531'; w

我希望在SQL Server存储过程中列出两个日期之间的日期

例如:

Date1: 2015-05-28
Date2: 2015-05-31
结果:

2015-05-29
2015-05-30
如何计算两个给定日期之间的所有日期


关于,

创建一个执行以下操作的存储过程:

declare @startDate date;
declare @endDate date;

select @startDate = '20150528';
select @endDate = '20150531';

with dateRange as
(
  select dt = dateadd(dd, 1, @startDate)
  where dateadd(dd, 1, @startDate) < @endDate
  union all
  select dateadd(dd, 1, dt)
  from dateRange
  where dateadd(dd, 1, dt) < @endDate
)
select *
from dateRange


或者最好创建一个日历表,然后从中进行选择。

您可以使用数字表:

DECLARE @Date1 DATE, @Date2 DATE
SET @Date1 = '20150528'
SET @Date2 = '20150531'

SELECT DATEADD(DAY,number+1,@Date1) [Date]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Date1) < @Date2

我使用以下工具制作日历:

然后一个存储过程传递两个日期,仅此而已:

USE DB_NAME;
GO

CREATE PROCEDURE [dbo].[USP_LISTAR_RANGO_FECHAS]
@FEC_INICIO date,
@FEC_FIN date
AS
Select Date from CALENDARIO where Date BETWEEN @FEC_INICIO AND @FEC_FIN;
用这个,

DECLARE @start_date DATETIME = '2015-02-12 00:00:00.000';
DECLARE @end_date DATETIME = '2015-02-13 00:00:00.000';

WITH    AllDays
          AS ( SELECT   @start_date AS [Date], 1 AS [level]
               UNION ALL
               SELECT   DATEADD(DAY, 1, [Date]), [level] + 1
               FROM     AllDays
               WHERE    [Date] < @end_date )
     SELECT [Date], [level]
     FROM   AllDays OPTION (MAXRECURSION 0)

您可以创建一个传递2个日期的存储过程

CREATE PROCEDURE SELECTALLDATES
(
@StartDate as date,
@EndDate as date
)
AS
Declare @Current as date = DATEADD(DD, 1, @BeginDate);

Create table #tmpDates
(displayDate date)

WHILE @Current < @EndDate
BEGIN
insert into #tmpDates
VALUES(@Current);
set @Current = DATEADD(DD, 1, @Current) -- add 1 to current day
END

Select * 
from #tmpDates

drop table #tmpDates

我不会那么做的。如果我无法访问master怎么办?@LuisLL这只是数字表的一个简单示例,op可以使用任何其他表或日历表。它通常比递归CTE快,虽然我喜欢使用它们,但我知道它们会带来性能问题,如果您需要获得较长的日期范围。。。大概15-20年。因为它使用的是table master..spt_值不是防弹的,因为spt_值的范围限制在0-2047之间。对于大多数人来说,它是最好的解决方案,它很短,产生的噪音也较少,即使它不是最通用的。尽管如此,人们可能会想,为什么用SQL生成数字/日期列表如此困难……我认为每个数据库都应该有一个日历表考虑选项maxrecursion 32767
Date                    level
----------------------- -----------
2015-02-12 00:00:00.000 1
2015-02-13 00:00:00.000 2

(2 row(s) affected)
CREATE PROCEDURE SELECTALLDATES
(
@StartDate as date,
@EndDate as date
)
AS
Declare @Current as date = DATEADD(DD, 1, @BeginDate);

Create table #tmpDates
(displayDate date)

WHILE @Current < @EndDate
BEGIN
insert into #tmpDates
VALUES(@Current);
set @Current = DATEADD(DD, 1, @Current) -- add 1 to current day
END

Select * 
from #tmpDates

drop table #tmpDates