Sql server 如何列出两个日期之间的所有日期
我希望在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
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