说我有一张包含这些记录的表格:
Date |Instances
2015-10-12 06:15:00.000 |2
2015-10-12 06:45:00.000 |5
2015-10-12 04:15:00.000 |2
2015-10-12 04:25:00.000 |3
2015-10-12 03:15:00.000 |5
2015-10-12 02:15:00.000 |6
2015-10-12 01:15:00.000 |6
我设法在同一时间内将所有实例与以下查询相加:
SELECT DATEPART(HOUR,DATE) as TIMEHOUR,
SUM([INSTANCES]) as INSTANCESUM
FROM TABLE (NOLOCK)
where DATE BETWEEN DATEADD(HOUR, -5, GETUTCDATE()) AND GETUTCDATE()
group by DATEPART(HOUR, DATE)
order by DATEPART(HOUR, DATE) DESC
结果是这样的:
TIMEHOUR | INSTANCESUM
6 | 7
4 | 5
3 | 5
2 | 6
1 | 6
但如果没有,我需要将小时记录为0。假设UTC时间是06:00,表格将返回如下内容:
TIMEHOUR | INSTANCESUM
6 | 7
---> 5 | 0 <---
4 | 5
3 | 5
2 | 6
1 | 6
在ms sql上可以吗?
[编辑]
我需要的是结果表总是具有相同的输入量,具体取决于我设置的时间范围。因此,即使在该时间范围内没有记录,结果表仍然具有该记录数,只有0作为值
TIMEHOUR | INSTANCESUM
6 | 0
5 | 0
4 | 0
3 | 0
2 | 0
1 | 0
答案 0 :(得分:0)
请参阅以下代码:
UIViewController
输出:
declare @temp table (timehour int, instancesum int)
insert into @temp values (6,7), (4,5), (3,5), (2,6), (1,6) -- Replace values with your original query.
select timehour, instancesum from @temp
union
select l.timehour + 1 as timehour, 0
from
@temp as l
left join @temp as r on l.timehour + 1 = r.timehour
where
l.timehour < (select max(timehour) from @temp) and
r.timehour is null
我在MS-SQL中尝试了这个,因为我没有使用过MySQL。但是大多数逻辑仍然是相同的。我不确定的唯一部分是在MySQL中创建@temp临时表。如果你可以改变那部分(如果需要的话),你就是好人。
答案 1 :(得分:0)
要回答原始问题,您可以在相同的小时内将表连接到自身,并且在左连接中一小时内未出现的实例应将其总和报告为空,然后您可以应用nvl处理输出0作为它们的总和。像这样:
SELECT
DATEPART(t.HOUR,t.DATE) as TIMEHOUR
, nvl(SUM([ti.INSTANCES]), 0) as INSTANCESUM
FROM TABLE (NOLOCK) as t
left join TABLE as ti
on
DATEPART(t.HOUR,t.DATE) =
DATEPART(ti.HOUR,ti.DATE)
where
DATE BETWEEN DATEADD(HOUR, -5, GETUTCDATE()) AND GETUTCDATE()
group by
DATEPART(HOUR, DATE)
order by
DATEPART(HOUR, DATE) DESC
在评论中回答你的第二个问题:
您应该能够以任何您想要的格式输出日期时间
To_char(date, 'yyyymmdd hh:mm:ss')
至少在Oracle中可以使用的是什么,MySQL语法可能略有不同。