如何在sql server 2005中获取x和y之间的日期表
-
01-07-2019 - |
题
我只是想要一种快速的方法(最好不使用 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 < 结束日期
不隶属于 StackOverflow