我正在创建一个基于当前1天获取数据的查询。我希望它可以获取日期范围内所有日期的数据,所以只是在想法和基本结构之后才能获得最佳结果。
示例查询
Select date
from table
where date between 01/01/2014 and 05/01/2014
理想情况下,结果返回的结果如下
2014年1月1日
2014年2月1日
2014年3月1日
2014年4月1日
2014年5月1日
答案 0 :(得分:2)
以下是使用计数表而不是三角形连接的方法。
create Procedure GenerateDateRange(@FromDate Date, @ToDate Date)
As
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
E6(N) AS (SELECT 1 FROM E4 a, E2 b),
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E6
)
select DATEADD(day, t.N - 1, @FromDate) as MyDate
from cteTally t
where N <= DATEDIFF(day, @FromDate, @ToDate) + 1
go
现在让我们比较一下这个选择作为答案的三角连接方法的性能。
declare @FromDate date = '1000-01-01', @ToDate date = '3000-01-01'
exec spGenerateDateRange @FromDate, @ToDate
exec GenerateDateRange @FromDate, @ToDate
答案 1 :(得分:1)
你提到过你想要一个存储过程,所以这应该对你有用:
Create Procedure spGenerateDateRange(@FromDate Date, @ToDate Date)
As Begin
;With Date (Date) As
(
Select @FromDate Union All
Select DateAdd(Day, 1, Date)
From Date
Where Date < @ToDate
)
Select Date
From Date
Option (MaxRecursion 0)
End
答案 2 :(得分:1)
这可能对你有用
DECLARE @DateFrom date, @DateTo date;
SET @DateFrom='20140801';
SET @DateTo='20140805';
WITH DateRange(date)
AS
(
SELECT @DateFrom
UNION ALL
SELECT DateAdd(day,1,D.date) FROM DateRange D WHERE D.date < @DateTo
)
SELECT date FROM DateRange