Sql server ms sql组2小时
下面是我在sql server 2017上运行的ms sql代码:Sql server ms sql组2小时,sql-server,database,ssms,sql-server-2017,Sql Server,Database,Ssms,Sql Server 2017,下面是我在sql server 2017上运行的ms sql代码: DECLARE @report_int TABLE ( atimestamp DATETIME, adate DATE, ahour INT, intvalue INT, attribute CHAR(254), total INT ) INSERT INTO @report_int SELECT el.servertimestamp, cast(el.servertimestamp as da
DECLARE @report_int TABLE
(
atimestamp DATETIME,
adate DATE,
ahour INT,
intvalue INT,
attribute CHAR(254),
total INT
)
INSERT INTO @report_int
SELECT
el.servertimestamp,
cast(el.servertimestamp as date) adate,
(DATEPART(HH,el.servertimestamp)) ahour,
el.intvalue,
el.attributes,
0
FROM
eventlog el
where
el.servertimestamp BETWEEN '6/29/2017'
AND DATEADD(dd, +1, '6/29/2019')
and (attributes LIKE '%N<=>OlympieioIn%' OR attributes LIKE '%N<=>OlympieioOut%')
order by
el.servertimestamp
DECLARE @report TABLE
(
adate datetime,
ahour int,
came_in bigint,
gone_out bigint
)
--fill report with dates and hours
INSERT INTO @report (adate, ahour) SELECT DISTINCT adate, ahour FROM @report_int
--reset
UPDATE @report set came_in = 0, gone_out = 0
--update in totals, min and max times
UPDATE @report SET came_in = i.total from
@report r,
(
select adate, ahour, COUNT(*) total
FROM @report_int
WHERE attribute LIKE 'N<=>OlympieioIn'
GROUP BY adate, ahour
) i
WHERE
i.adate = r.adate
and i.ahour = r.ahour
--update out totals
UPDATE @report SET gone_out = i.total from
@report r,
(
SELECT adate, ahour, COUNT(*) total
FROM @report_int
WHERE attribute LIKE 'N<=>OlympieioOut'
GROUP BY adate, ahour
) i
where
i.adate = r.adate
and i.ahour = r.ahour
select
adate,
ahour,
RIGHT('00'+cast(ahour as varchar),2)+':00 - '+RIGHT('00'+cast(ahour+1 as varchar),2)+':00' timeframe,
came_in,
gone_out
from
@report
DECLARE@report\u int表
(
atimestamp日期时间,
日期,
阿胡尔·因特,
intvalue INT,
属性字符(254),
总整数
)
插入@report\u int
挑选
el.servertimestamp,
转换(el.servertimestamp as date)adate,
(DATEPART(HH,el.servertimestamp))ahour,
el.intvalue,
el.attributes,
0
从…起
事件日志
哪里
el.servertimestamp介于“2017年6月29日”
和日期添加(日期+1,'2019年6月29日')
和(像“%NOlympieioIn%”这样的属性或像“%nolympieiout%”这样的属性)
订购人
el.servertimestamp
声明@report表
(
日期时间,
阿胡尔·因特,
来到比金特,
外出度假
)
--在报告中填写日期和时间
插入到@report(adate,ahour)中,从@report\u int中选择不同的adate,ahour
--重置
更新@report set进来=0,出去=0
--更新总计、最小和最大时间
更新@report SET\u in=i.total from
@报告r,
(
选择adate、ahour、COUNT(*)总计
来自@report\u int
“NOlympieioIn”之类的属性
阿胡尔阿达特集团
)我
哪里
i、 adate=r.adate
i.ahour=r.ahour
--更新总数
更新@report SET gone_out=i.来自的总计
@报告r,
(
选择adate、ahour、COUNT(*)总计
来自@report\u int
“nolympieiout”之类的属性
阿胡尔阿达特集团
)我
哪里
i、 adate=r.adate
i.ahour=r.ahour
选择
阿达特,
阿胡尔,
右('00'+cast(ahour作为varchar),2)+':00-'+RIGHT('00'+cast(ahour+1作为varchar),2)+':00'时间段,
你进来了,
出去
从…起
@报告
此代码显示每天有多少人进出建筑物。如您所见,进出的人数按小时分组显示。
下面是已执行代码的屏幕截图
我要做的是将这些数据分组为2小时的分组。例如,上面执行代码的第3小时和第4小时的分组将是:
日期(日期):2018-05-12
小时(小时):15
时间范围:15:00-17:00
进来了:0
走出去:2
非常感谢您的帮助
谢谢。我只需手动创建一个时间表并加入其中。 时间表将有24行(每小时一行),可以如下所示: 小时时帧两小时时帧
13:00-14:00 13:00-15:00获取最后2小时时段的日期时间的一种方法是使用:
DATEADD(HOUR, DATEDIFF(HOUR, 0, YourDateColumn) - (DATEDIFF(HOUR, 0, YourDateColumn) % 2), 0)
如果我们随后获取一些(随机)样本数据,您将得到以下结果:
WITH VTE AS (
SELECT CONVERT(datetime2(0),V.DT) AS DT
FROM (VALUES('2018-07-04T00:11:32'),('2018-07-04T01:17:12'),('2018-07-04T02:00:01'),('2018-07-04T07:49:59'),('2018-07-04T07:59:58'),('2018-07-04T08:00:00')) V(DT))
SELECT DT, DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0) AS DT2h
FROM VTE;
返回:
DT DT2h
--------------------------- -----------------------
2018-07-04 00:11:32 2018-07-04 00:00:00.000
2018-07-04 01:17:12 2018-07-04 00:00:00.000
2018-07-04 02:00:01 2018-07-04 02:00:00.000
2018-07-04 07:49:59 2018-07-04 06:00:00.000
2018-07-04 07:59:58 2018-07-04 06:00:00.000
2018-07-04 08:00:00 2018-07-04 08:00:00.000
如果您想按2小时时段进行计数,请执行以下操作:
WITH VTE AS (
SELECT CONVERT(datetime2(0),V.DT) AS DT
FROM (VALUES('2018-07-04T00:11:32'),('2018-07-04T01:17:12'),('2018-07-04T02:00:01'),('2018-07-04T07:49:59'),('2018-07-04T07:59:58'),('2018-07-04T08:00:00')) V(DT))
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0) AS DT2h, COUNT(DT) AS C
FROM VTE
GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, DT) - (DATEDIFF(HOUR, 0, DT) % 2), 0);
返回:
DT2h C
----------------------- -----------
2018-07-04 00:00:00.000 2
2018-07-04 02:00:00.000 1
2018-07-04 06:00:00.000 2
2018-07-04 08:00:00.000 1
你没有在前端处理这个问题有什么特别的原因吗?如果您只是显示data@MasonStedman我正在使用I-report软件制作报告,据我所知,这是提取所需数据的最佳方法,因此,我认为JSON在这里没有任何帮助。我的意思是,你可以拉每小时的细分,并通过前端的JS处理每两小时\每小时的数据,而不是重新调用每个报告的数据,如果他们想要不同的细分样式。我真的不知道你在前端想做什么,所以很难说。谢谢你的帮助,我会按照你的建议做,如果我完成了工作,我会告诉你的。