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