首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于识别时间数据中的间隙的查询

用于识别时间数据中的间隙的查询
EN

Stack Overflow用户
提问于 2011-05-13 22:21:07
回答 3查看 3.3K关注 0票数 1

我是数据库编程的新手,我需要一些帮助来编写一个看起来很复杂的t-sql查询。

我们的数据库存储时间数据以及当时记录的各种级别。典型的测量将持续数周或数月。我需要在SqlServer2005中编写一个查询,以确定时间数据中的差距,以便知道仪器何时不能通信。我们的采样间隔可以是1秒或1秒,但在给定的测量中它始终是相同的(即:测量中的所有样本都将是1或.5样本/秒)。

理想情况下,我希望获得block1-start block1-end等列表

其中每个块是整个测量范围内的连续时间单位。

TSQL中有没有什么命令可以简化这个查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-13 23:02:07

看看这个。因为没有重叠的时间间隔,所以可以编写一个简单的SQL查询来返回这些结果。下面的SQL创建一个名为@Events的虚拟表变量来模拟您的测量表。最后一个查询输出大于1秒的间隔(可通过变量@MaxIntervalAllowedBetweenEvents配置)。

代码语言:javascript
复制
-- table with dummy data
declare @Events table (
    ID          int IDENTITY NOT NULL,
    StartDate   datetime NOT NULL,
    EndDate     datetime NOT NULL
)
INSERT @Events VALUES ('1/1/2011 1:00am', '1/1/2011 2:00am')
INSERT @Events VALUES ('1/1/2011 2:00am', '1/1/2011 3:00am')  -- no gap after previous event
INSERT @Events VALUES ('1/1/2011 3:01am', '1/1/2011 4:00am')  -- 1 minute gap
INSERT @Events VALUES ('1/1/2011 4:30am', '1/1/2011 5:00am')  -- 30 minute gap


-- this variable defines the maximum interval allowed between events
declare @MaxIntervalAllowedBetweenEvents int
set @MaxIntervalAllowedBetweenEvents = 1    -- # seconds


-- select the gaps between events
SELECT
    e1.EndDate,
    Min(e2.StartDate) as NextEventStartDate,
    DateDiff(s, e1.EndDate, Min(e2.StartDate)) as SecondsBetweenEvents
FROM
    @Events as e1
join
    -- for each event in e1, get the event that immediately follows it
    @Events as e2
        on  (e1.EndDate <= e2.StartDate)
GROUP BY
    e1.EndDate
HAVING
    -- filter out events that are too close to each other
    (DateDiff(s, e1.EndDate, Min(e2.StartDate)) > @MaxIntervalAllowedBetweenEvents)
ORDER BY
    e1.EndDate
票数 5
EN

Stack Overflow用户

发布于 2011-05-13 22:29:16

Oracle对此有很多强大的分析功能。

我认为你需要做的是从sql语句中创建一个游标,它将按照Date,StartTime,EndTime对结果进行排序。

票数 1
EN

Stack Overflow用户

发布于 2015-02-05 04:49:06

可以像这样使用接受日期输入的表来获取两次登录之间的时间...

如果您的表上已经有一个标识,则省略ROW_NUMBER位。

代码语言:javascript
复制
{select 
    Start.ID
    ,Done.ID
    ,Start.<Date_Column>
    ,Done.<Date_Column>
    ,DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>) AS InBetween
from 
    (SELECT
        ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID
        ,<Date_Column>
    FROM
        <Tablename> (NOLOCK)
    ) START
    INNER JOIN (
        SELECT
            ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID
            ,<Date_Column>
        FROM
            <Tablename> (NOLOCK)
        ) DONE  ON START.ID + 1 = DONE.ID
ORDER BY
    DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>)DESC}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5993309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档