查找上一集中的开始和结束日期以及SQL Server中剧集之间的间隔持续时间

时间:2013-12-19 15:44:44

标签: sql sql-server sql-server-2008-r2

我一直在寻找答案,但我找不到一个完全符合我问题的答案。

我想要找到的是之前“剧集”的起点和终点以及这些“剧集”之间的差距持续时间(如果适用)。我添加了一个链接到我在SQL Fiddle上创建的一些示例数据,我试图尽可能地复制数据。

剧集的定义是什么?剧集开始于某个时间点只有一个开放事件,最后一个事件结束时结束。每个人在一段时间内可以有多个“剧集”。

SQL Fiddle Example

我报告的表包含父数据和子数据,而不是需要识别父项或子项,但数据有点乱,例如有关闭的父记录,其子记录仍然打开。有很多重叠日期(有时用peculator方式)。

我迷失在迷宫般的陈述中!!

非常感谢任何帮助!

如果需要更多背景信息,请询问!

提前致谢!

1 个答案:

答案 0 :(得分:0)

我自己设法解决了这个问题,我创建了下面的表函数,每个人都会产生上一集的结束日期和下一集的开始日期,其中有一个空白:

CREATE FUNCTION fun_tbl_find_gaps_in_referrals
(
    @v_person_id int
)
RETURNS 
@gaps TABLE 
(
    end_date smalldatetime,
    start_date smalldatetime
)
AS
BEGIN
    insert into @gaps
    select distinct
        e1.end_date,
        e2.start_date
    from
        EVENTS e1
        join EVENTS e2
        on e1.end_date < e2.start_date
        and e1.person_id = @v_person_id
        and e2.start_date =
            (select 
                MIN(start_date)
            from
                EVENTS e3
            where
                e3.start_date > e1.end_date
                and person_id = @v_person_id)
        and not exists
            (select
                *
            from
                EVENTS e
            where
                e.start_date < e1.end_date
                and e.end_date > e1.end_date
                and e.person_id = @v_person_id)
    RETURN 
END

只需使用 DATEDIFF 函数计算两个日期之间的持续时间。

select distinct
    person_id,
    gaps.end_date,
    gaps.start_date,
    datediff(day,gaps.end_date,gaps.start_date) as duration
from
    EVENTS evnt
    cross apply fun_tbl_find_gaps_in_referrals(evnt.person_id) gaps

这是Fiddle