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

Dna*_*Jam 20 sql-server stored-procedures

我想列出SQL Server存储过程中两个日期之间的日期.

例如:

Date1: 2015-05-28
Date2: 2015-05-31
Run Code Online (Sandbox Code Playgroud)

结果:

2015-05-29
2015-05-30
Run Code Online (Sandbox Code Playgroud)

如何计算两个给定日期之间的所有日期?

问候,

Lam*_*mak 36

您可以使用数字表:

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
Run Code Online (Sandbox Code Playgroud)

结果:

??????????????
?    Date    ?
??????????????
? 2015-05-29 ?
? 2015-05-30 ?
??????????????
Run Code Online (Sandbox Code Playgroud)

  • 我不会这样做.如果我无法访问`master`怎么办? (2认同)
  • 如果您需要较长的日期范围(例如15至20年),则存在局限性。由于它使用表master..spt_values (2认同)

SAM*_*SAM 25

用这个,

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)
Run Code Online (Sandbox Code Playgroud)

@start_date@end_date作为SP参数传递.

结果:

Date                    level
----------------------- -----------
2015-02-12 00:00:00.000 1
2015-02-13 00:00:00.000 2

(2 row(s) affected)
Run Code Online (Sandbox Code Playgroud)


Ian*_*ton 18

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

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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示.

或者更好的是仍然创建一个日历表,然后从中进行选择.

  • 我认为每个数据库都应该有一个日历表 (4认同)
  • 考虑`option(maxrecursion 32767)` (2认同)