如何在 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/2008 中清除查询执行统计信息