SQL计算已知时期内的不同时间范围

标签 sql sql-server sql-server-2008 count period

如何计算连续的时间范围

我的数据是这样的:

Id| Em_Name|Em_Reg_Date
--------------------------------
1 | John   |2010-03-30 00:00:00  
1 | John   |2010-03-31 00:00:00  
2 | Marc   |2010-10-26 00:00:00  
2 | Marc   |2010-10-27 00:00:00  
2 | Marc   |2010-10-28 00:00:00  
2 | Marc   |2010-10-29 00:00:00  
2 | Marc   |2010-12-16 00:00:00  
2 | Marc   |2010-12-17 00:00:00    
2 | Marc   |2010-12-20 00:00:00  
2 | Marc   |2010-12-21 00:00:00  
2 | Marc   |2010-12-22 00:00:00  
3 | Paul   |2010-02-25 00:00:00  
3 | Paul   |2010-02-26 00:00:00  
3 | Paul   |2010-12-13 00:00:00  
3 | Paul   |2010-12-14 00:00:00  
3 | Paul   |2010-12-15 00:00:00  
--------------------------------

时间范围是连续的时间段。
例如Paul 有以下两 (2) 个时间范围

 FRAME 1 FROM 2010-02-25 00:00:00  to 2010-02-26 00:00:00  
 FRAME 2 FROM 2010-12-13 00:00:00  to 2010-12-15 00:00:00  

所以,结果应该是这样的

1 John   1  
2 Marc   3  
3 Paul   2  

问题是:我需要计算每个员工的时间范围。

这里的问题在于我需要隔离连续的时间范围以便对它们进行计数。我什至尝试过声明游标(可行,但我必须将数据存储在临时表中)我希望它在“简单”的 sql 语句中 使用 max 查找开始日期仅适用于一帧。你找不到最大的第二/第三帧。

有没有人有新鲜的想法?

最佳答案

SQL Server 2005+

select em_name, COUNT(distinct startdate)
from
(
    select *, startdate = em_reg_date - ROW_NUMBER() over (
        partition by em_name order by em_reg_date) +1
    from tbl
) X
group by Em_Name

Oracle、DB2 也支持 Row_Number(),但是您需要一些变化来计算开始日期

关于SQL计算已知时期内的不同时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5117500/

相关文章:

c# - 如何更新 unpivot 查询中的列我的查询附加 SQL Server?

sql - 不允许新事务,因为 session 中还有其他线程正在运行。 SQL Server 中的错误

sql - 更新表变量

sql-server-2005 - 将SQL Server 2008 DB *还原到SQL Server 2005

sql - 使用 LIKE 获取仅包含特定字符的记录

php - Codeigniter 无法连接到 MSSQL 数据库

mysql - SQL 存储过程不工作

c# - 使用 SqlHelper.ExecuteDataSet() 执行 SQL Server 存储过程并获取返回值

sql - 比较几何时查询速度慢

mysql - 左/右连接性能