我想为过去 24 小时的数据集创建一个图表。
我找到了一个可行的解决方案,但这非常糟糕,因为我外部连接的表包含数据库中的每一行,因为我在分组依据中使用(现已弃用)“all”参数。
这是目前有效的解决方案。 首先,我声明日期间隔是从现在起 24 小时后的时间。我声明了两次,这样我也可以在稍后的过程中使用它。
Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @StartDateProc datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()
我将日期填充到临时表中,其中包括特殊格式的日期环。
create table #tempTable
(
Date datetime,
DateString varchar(11)
)
while @StartDate <= @EndDate
begin
insert into #tempTable (Date, DateString)
values (@StartDate, convert(varchar(8), @StartDate, 5) + '-' + convert(varchar(2), @StartDate, 108));
SET @StartDate = dateadd(hour,1, @StartDate);
end
这给了我如下所示的数据:
Date DateString
---------------------------------------------
2015-12-09 13:59:01.970 09-12-15-13
2015-12-09 14:59:01.970 09-12-15-14
2015-12-09 15:59:01.970 09-12-15-15
2015-12-09 16:59:01.970 09-12-15-16
所以我想要的是将我的数据集加入匹配的日期字符串并显示日期,即使匹配的行为零。
这是查询的其余部分
select
Date = c.Date,
Amount = sum(c.Amount)
from
DbTable a
outer apply
(select
Date = b.DateString,
Amount = count(*)
from
#tempTable b
where
convert(varchar(8), a.DateColumn, 5) + '-' + convert(varchar(2), a.DateColumn, 108) = b.DateString
group by all
b.DateString) c
where
a.SomeParameter = 'test' and
a.DateColumn >= @StartDateProc and
a.DateColumn <= @EndDate
group by
c.Date
drop table #tempTable
测试显示实际数据:
Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()
select
dateString = convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108),
Amount = COUNT(*)
from
DbTable a
where
a.someParameter = 'test' and
a.DateColumn>= dateadd(hour, -24, getdate()) and
a.DateColumn<= getdate()
group by
convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108)
第一个输出行:
dateString Amount
09-12-15-14 1
09-12-15-15 1
09-12-15-16 1
09-12-15-17 3
09-12-15-18 1
09-12-15-22 3
09-12-15-23 2
正如您在此处看到的,没有 19:00 到 21:00 的时间数据。这就是我想要的数据显示方式:
dateString Amount
09-12-15-14 1
09-12-15-15 1
09-12-15-16 1
09-12-15-17 3
09-12-15-18 1
09-12-15-19 0
09-12-15-20 0
09-12-15-21 0
09-12-15-22 3
09-12-15-23 2
最佳答案
通常,这将通过左连接
而不是外部应用
来实现。逻辑很简单:保留第一个表中的所有行以及第二个表中的任何匹配信息。这意味着将日期表放在第一位:
select tt.DateString, count(t.DateColumn) as Amount
from #tempTable tt left join
DbTable t
on convert(varchar(8), t.DateColumn, 5) + '-' + convert(varchar(2), t.DateColumn, 108) = tt.DateString and
t.SomeParameter = 'test'
where tt.Date >= @StartDateProc and
tt.Date <= @EndDate
group by tt.DateString;
此外,您对日期的比较似乎过于复杂,但如果它适合您,那么它就有效。
关于SQL 计数为零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202768/