10

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

4

8 回答 8

18

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

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

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 )
于 2008-09-18T19:00:12.120 回答
1

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

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y
于 2008-09-18T19:29:22.563 回答
0

我认为您不妨在一个while循环中执行它。我知道这很丑,但它很容易而且很有效。

于 2008-09-18T18:26:06.133 回答
0

不久前我实际上正在做类似的事情,但我想不出一种不使用循环的方法。

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

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

于 2008-09-18T18:27:19.937 回答
0

我找到了另一个存储每个日期的表(它是网站的访问者),那么这个怎么样......

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% 的可能性是每天都会有数据。

于 2008-09-18T18:41:59.073 回答
0

对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 )
于 2016-03-15T01:32:54.143 回答
-1

只写循环。有人必须为此编写一个循环,无论是您还是 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
于 2008-09-18T19:21:14.520 回答
-4

只是: WHERE col > start-date AND col < end-date

于 2008-09-18T18:22:56.593 回答