如何在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