sql-server - rango - operaciones con fechas sql
Cómo listar todas las fechas entre dos fechas (5)
Cree un procedimiento almacenado que haga algo como lo siguiente:
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
O mejor aún, cree una tabla de calendario y simplemente seleccione de eso.
Esta pregunta ya tiene una respuesta aquí:
Me gustaría listar fechas entre dos fechas en un procedimiento almacenado de SQL Server.
Por ejemplo:
Date1: 2015-05-28
Date2: 2015-05-31
Resultados:
2015-05-29
2015-05-30
¿Cómo calcular todas las fechas entre dos fechas dadas?
Saludos,
Hice un calendario usando:
http://social.technet.microsoft.com/wiki/contents/articles/22776.t-sql-calendar-table.aspx
luego un procedimiento de tienda que pasa dos fechas y eso es todo:
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;
Puedes crear un procedimiento almacenado pasando 2 fechas.
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
Puedes usar una tabla de números:
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
Resultados:
╔════════════╗
║ Date ║
╠════════════╣
║ 2015-05-29 ║
║ 2015-05-30 ║
╚════════════╝
Utilizar esta,
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)
pase los parámetros @start_date y @end_date como parámetros SP.
Resultado:
Date level
----------------------- -----------
2015-02-12 00:00:00.000 1
2015-02-13 00:00:00.000 2
(2 row(s) affected)