如何获取在x和y之间的日期表在sql服务器2005

问题描述:

我只想要一个快速的方法(最好不使用while循环)创建日期@x和日期@y之间的每个日期的表,所以我可以将外部联接留给某些统计表,其中一些统计表在其间的某些统计表中没有记录,从而允许我用缺少的记录标记0如何获取在x和y之间的日期表在sql服务器2005

严格来说,这并不完全回答你的问题,但它的整洁。

假设你可以指定天数的开始日期后,再使用公共表表达式生活给你:

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) 
+0

你是一个天才!干得好,没有想到使用CTE! – digiguru 2008-09-18 19:26:09

Just:WHERE col> start-date AND col < end date date

+0

他试图创建一个表来做左外连接。这不会做他想做的事。 – 2008-09-18 18:25:08

我相信你正在寻找this blog post

+0

它很脏,但它做的工作 – digiguru 2008-09-18 18:26:47

+0

它可以移植到其他SQL引擎(包括Server 2000)。 :) – IDisposable 2009-10-19 19:54:24

我认为你不妨在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%可能会有每天的数据。

只要写循环。有人必须为此编写一个循环,无论是你还是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 

我会创建一个日历表,它只包含从合适的开始日期到合适的结束日期的每个日期。这不会占用您数据库中的太多空间,并且会使这些类型的查询变成游戏。

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

作为https://stackoverflow.com/a/95728/395440给出的答案略有扭曲。允许指定日期并计算到当前日期的范围。

DECLARE @startDate datetime 
SET @startDate = '2015/5/29'; 

WITH number (n) AS (
     SELECT 1 UNION ALL 
     SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE())) 
    SELECT DATEADD(day,n-1,@startDate) FROM number where 
    datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday') 
    OPTION (MAXRECURSION 500)