Sql server ms sql组2小时

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

下面是我在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 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处理每两小时\每小时的数据,而不是重新调用每个报告的数据,如果他们想要不同的细分样式。我真的不知道你在前端想做什么,所以很难说。谢谢你的帮助,我会按照你的建议做,如果我完成了工作,我会告诉你的。