我只是想要一种快速的方法(最好不使用 while 循环)创建日期 @x 和日期 @y 之间的每个日期的表,这样我就可以将外部连接保留到一些统计表,其中一些统计表没有某些记录之间的天数,允许我用 0 标记缺失的天数

有帮助吗?

解决方案

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

假设您可以接受指定开始日期后的天数,那么使用通用表表达式将为您提供:

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 )

其他提示

我相信你正在寻找 这篇博文.

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

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

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

对给出的答案略有不同 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 )

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top