获取日期范围内的所有日期

时间:2014-08-05 14:49:01

标签: sql sql-server

我正在创建一个基于当前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日

3 个答案:

答案 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