2014-07-11 108 views
-3

我想知道如果有一种方法来检索SQL Server的所有日期的列表。我知道使用getdate()函数将检索当前的日期和时间。有没有函数可以返回所有日期的列表?检索日期的SQL Server

+1

什么??????????? –

+1

考虑到大约有140亿个“日期”,并且每个日期的无限次数,您将等待一段时间来查询结果。如果你想包括未来的日期,那么它也会延长几分钟。 –

+0

所有日期?但我认为时间是无限的伟大...... – DMason

回答

3

不是来自内置功能,没有,但你可以创建自己的function做这个。

您可以通过下面的生成日期的列表:

Declare @FromDate Date = '2014-04-21', 
     @ToDate  Date = '2014-05-02' 

;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) 

使用这个逻辑,你可以创建自己的function做相同的:

Create Function udf_GenerateDateRange(@From Date, @To Date) 
Returns @Date Table 
(
    Date Date 
) 
As Begin 

    ;With Date (Date) As 
    (
     Select @From Union All 
     Select DateAdd(Day, 1, Date) 
     From Date 
     Where Date < @To 
    ) 
    Insert @Date 
    Select Date 
    From Date 
    Option (MaxRecursion 0) 

    Return 
End 

使用function可以选择一切在日期范围内通过:

Select * From udf_GenerateDateRange('2014-01-01', '2014-05-10') 

我d不知道“所有日期”是什么意思,但是您应该能够传入开始日期和结束日期,并且它会返回所有日期之间的所有内容。

+0

我不能投票,因为我不知道OP要求什么 –

+0

我正在阅读他的问题,因为“我如何生成日期列表?” – Siyual

+0

非常感谢您的回答。这正是我一直在寻找的 - 即使我有困难discribing我想要的东西,哈哈 – user3109653

3

此功能将让你从开始日期列表以指定频率才能完成。

IF OBJECT_ID('ListDates') IS NOT NULL DROP FUNCTION ListDates 
GO 

CREATE FUNCTION [dbo].[ListDates] 
/* 
    returns a list of intervals with the given frequency that start after @StartDate and 
    before @EndDate. 
*/ 
(
    @Frequency int, 
    @StartDate DateTime, 
    @EndDate DateTime) 
/* 
    @Frequency: 
     0 - day, 
     1 - week, 
     2 - month 
     3 - 3 months 
     4 - 6 months 
     5 - year 
*/ 
returns @List TABLE (StartRange Date, EndRange Date) 
BEGIN 
    with dates as (
     SELECT cast(@StartDate as Date) [date] 
     UNION ALL 
     SELECT 
     CASE @Frequency 
      WHEN 0 THEN DATEADD(day,1,t.date) 
      WHEN 1 THEN DATEADD(week,1,t.date) 
      WHEN 2 THEN DATEADD(month,1,t.date) 
      WHEN 3 THEN DATEADD(month,3,t.date) 
      WHEN 4 THEN DATEADD(month,6,t.date) 
      WHEN 5 THEN DATEADD(year,1,t.date) 
     END 
     FROM dates t 
     WHERE t.[date] < @EndDate 
    ) 
    insert into @List (StartRange, EndRange) 
    select 
     [Date], 
     CASE @Frequency 
      WHEN 0 THEN DATEADD(day,1,[Date]) 
      WHEN 1 THEN DATEADD(week,1,[Date]) 
      WHEN 2 THEN DATEADD(month,1,[Date]) 
      WHEN 3 THEN DATEADD(month,3,[Date]) 
      WHEN 4 THEN DATEADD(month,6,[Date]) 
      WHEN 5 THEN DATEADD(year,1,[Date]) 
     END 
    from dates 
    WHERE [Date] < @EndDate 
    OPTION (MAXRECURSION 10000) 
    RETURN 
END 
GO