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

Posted

技术标签:

【中文标题】如何在 sql server 2005 中获取 x 和 y 之间的日期表【英文标题】:How to get a table of dates between x and y in sql server 2005 【发布时间】:2010-09-10 20:23:39 【问题描述】:

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

【问题讨论】:

我相信你在找this blog post。 它很脏,但能胜任 它可以移植到其他 SQL 引擎(包括 Server 2000)。 :) 【参考方案1】:

只是:WHERE col > start-date AND col

【讨论】:

他正在尝试创建一个表来进行左外连接。这不会做他想做的事。【参考方案2】:

我认为您不妨在 while 循环中执行此操作。我知道这很丑,但它很简单而且很有效。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

假设您可以忍受指定开始日期之后的天数,那么使用公用表表达式会给您:

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 )

【讨论】:

Option 子句不接受变量作为输入,因此必须知道编写代码时的天数。否则:有趣的东西。 但是 Where 子句确实如此,如果循环继续,MAXRECURSION 只是故障转移。 如果你不能使用 CTE(比如在 SQL Server 2000 中),那么你可以使用我在这里写的 musingmarc.blogspot.com/2006/07/… @BigJump 我不明白你在这里做什么(我不是 SQL Pro)。你能提供一个简短的解释吗?这只适用于 SQL Server 还是可以在 Postgres 数据库中使用?【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

https://***.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 2005 中获取 x 和 y 之间的日期表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2005 中获取事务日志的逻辑名称

如何查询数据库文化 (SQL Server 2005)?

如何安装sql server 2005

如何在 SQL Server 2005/2008 中清除查询执行统计信息

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

SQL Server 2005 SSIS - 如何从文件的第一行获取特殊信息