Comment listr toutes les dates entre deux dates

Je voudrais des dates de list entre deux dates dans une procédure stockée SQL Server.

Par exemple:

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

Résultats :

 2015-05-29 2015-05-30 

Comment calculer toutes les dates entre deux dates données?

Cordialement,

Vous pouvez utiliser une table de nombres:

 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 

Résultats:

 ╔════════════╗ ║ Date ║ ╠════════════╣ ║ 2015-05-29 ║ ║ 2015-05-30 ║ ╚════════════╝ 

Utilisez ceci,

 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) 

passez les parameters @start_date et @end_date en tant que SP.

Résultat:

 Date level ----------------------- ----------- 2015-02-12 00:00:00.000 1 2015-02-13 00:00:00.000 2 (2 row(s) affected) 

Créer une procédure stockée qui fait quelque chose comme ceci:

 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 

SQL Fiddle avec une démo .

Ou mieux encore créer une table de calendar et juste sélectionner à partir de cela.

J'ai fait un calendar en utilisant:

http://social.technet.microsoft.com/wiki/contents/articles/22776.t-sql-calendar-table.aspx

puis une procédure de magasin en passant deux dates et c'est tout:

 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; 

Vous pouvez créer une procédure stockée en passant 2 dates

 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