如何在SQL Server 2005中获取x和y之间的日期表

时间:2020-03-06 14:22:45  来源:igfitidea点击:

我只想要一种快速的方法(最好不要使用while循环)来创建日期@x和date @y之间的每个日期的表,这样我就可以离开外部联接到某些统计信息表,其中某些统计信息表没有某些记录之间的天数,让我用0标记缺少的日子

解决方案

只是:WHERE col>开始日期,而col <结束日期

我相信我们正在寻找此博客文章。

我认为我们不妨在while循环中这样做。我知道这很丑陋,但是很容易并且有效。

实际上,前一段时间我在做类似的事情,但是我无法提出一种不使用循环的方法。

我得到的最好的是一个临时表,然后选择我想加入的日期。

链接到博客的bduke很可爱,尽管我认为临时表解决方案也许是一种更清洁的解决方案。

我找到了另一个存储每个日期的表(它是网站的访问者),那么这又如何呢?

Declare @FromDate datetime,  
        @ToDate datetime  
Declare @tmpDates table   
            (StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()

Insert Into  @tmpDates (StatsDate)
Select 
    distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats 
Where visitDate between @FromDate And @ToDate 
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME) 

Select * FROM @tmpDates

它确实依赖于另一个表在我想要的每个日期中都有一个条目,但是有98%的可能性每天都会有数据。

严格说来,这并不能完全回答问题,但是很简洁。

假设我们可以指定开始日期之后的天数,那么使用"公用表表达式"可以为我们提供:

WITH numbers ( n ) AS (
        SELECT 1 UNION ALL
        SELECT 1 + n FROM numbers WHERE n < 500 )
    SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
    OPTION ( MAXRECURSION 500 )

只需编写循环。有人必须为此编写一个循环,无论是我们还是SQL Server。

DECLARE @Dates TABLE
(
  TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'

DECLARE @LoopVar int, @LoopEnd int    
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0

WHILE @LoopVar <= @LoopEnd
BEGIN
  INSERT INTO @Dates (TheDate)
  SELECT DateAdd(dd,@LoopVar,@StartDate)

  SET @LoopVar = @LoopVar + 1
END

SELECT *
FROM @Dates

我将创建一个Calendar表,其中仅包含从合适的开始日期到合适的结束日期的每个日期。这不会占用我们数据库中的太多空间,并且会使这些类型的查询变得不合时宜。

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y