添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

按日期范围分组

1 人关注

我使用的是SQL Server 2008,我想知道一种方法来返回按日期范围分组的事件计数。开始和结束之间的时间间隔总是一天。

例如,该查询应该返回类似的内容。

2014-07-01 15:00:00 | 2014-07-02 15:00:00 | 23

2014-07-02 15:00:00 | 2014-07-03 15:00:00 | 32

2014-07-03 15:00:00 | 2014-07-04 15:00:00 | 2123

2014-07-04 15:00:00 | 2014-07-05 15:00:00 | 231

在结果集中,可能只出现其中一列日期,但逻辑是一样的。

sql
sql-server-2008
Carlos Monteiro
Carlos Monteiro
发布于 2014-07-04
2 个回答
Grondag
Grondag
发布于 2017-05-23
0 人赞同

有趣的问题!

我假设你在表中有一个单一的日期/时间,并想提供一个开始和结束的日期/时间值作为参数。 我现在不能针对SQL Server进行编译,但类似这样的东西应该可以。

SELECT DATEDIFF (day, start_date, event_time) as period, 
       COUNT (event_time) as event_count
WHERE event_time >= @start_time
  AND event_time <= @end_time
GROUP BY DATEDIFF (day, @start_time, event_time)

如果你想显示每个时期的开始和结束时间,在选择语句中创建新的计算列,在@start_time和@end_time中添加DATEDIFF值。

例如,我想在我的数据库中获得一个月内的登录次数,我想以一天为单位计算,从早上7点到第二天早上7点。我试过这种方法。 SELECT DATEDIFF (day, '2014-06-04 07:00:00.000') as period, COUNT (fl.id) as event_count FROM FACTLOGIN flERE fl.datetime >= '2014-06-04 07:00:00.000' AND fl.datetime <= '2014-07-04 07:00:00.000' GROUP BY DATEDIFF (day, '2014-06-04 07:00:00.000', fl.datetime) Error: [Err] 42000 - [SQL Server]dateiff函数需要3个参数。
对不起,在我的例子中,我把事件时间从第一个DATEDIFF调用中删除了。 我在上面纠正了。 你的代码需要像这样。 SELECT DATEDIFF (day, '2014-06-04 07:00:00.000', fl.datetime) as period, COUNT (fl.id) as event_count FROM FACTLOGIN flERE fl.datetime >= '2014-06-04 07:00:00.000' AND fl.datetime <= '2014-07-04 07:00:00.000' GROUP BY DATEDIFF (day, '2014-06-04 07:00:00.000', fl.datetime)
Joseph B
Joseph B
发布于 2017-05-23
已采纳
0 人赞同

如果你在一列中有 event_time ,那么你可以确定它所处的区间,并找到每个区间内的事件数,如下所示。

其逻辑是,如果小时>=15(从15:00:00开始),start_time将是同一天的。对于 event_time ,在15:00:00之前,start_time将是前一天的时间。同样地,如果小时数>=15(从15:00:00开始),结束时间将是第二天。对于 event_time ,在15:00:00之前,end_time将是当天的时间。

select 
  when DATEPART(hh, event_time) >= 15 then DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME))
  else DATEADD(DAY, -1, DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME)))
END START_TIME,
  when DATEPART(hh, event_time) >= 15 then DATEADD(DAY, 1, DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME)))
  else DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME))
END END_TIME,
count(*) no_of_events
FROM events e
group by 
  when DATEPART(hh, event_time) >= 15 then DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME))
  else DATEADD(DAY, -1, DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME)))
END,
  when DATEPART(hh, event_time) >= 15 then DATEADD(DAY, 1, DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME)))
  else DATEADD(HOUR, 15, CAST(CAST(event_time AS DATE) AS DATETIME))
END;