当前位置: 首页 > 面试题库 >

计算两个日期之间缺少的日期范围和重叠的日期范围

能钟展
2023-03-14
问题内容

我的数据库中有以下一组匹配日期的日期(dd / MM / yyyy):

eventId startDate endDate
1 02/05/2009 10/05/2009
2 08/05/2009 12/05/2009
3 10/05/2009 12/05/2009
4 21/05/2009 21/05/2009
5 25/05/2009 NULL
6 01/06/2009 03/06/2009

事件具有开始和结束日期(时间无关紧要),并且endDate为NULL表示事件仍在进行中。

我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件重叠。

因此,对于输入日期范围01/04/2009-30/06/2009,我希望得到以下结果:

no event: 01/04/2009 - 01/05/2009
overlap : 08/05/2009 - 10/05/2009
overlap : 10/05/2009 - 12/05/2009
no event: 13/05/2009 - 20/05/2009
no event: 22/05/2009 - 24/05/2009
overlap : 01/06/2009 - 03/06/2009

注意,作为结果,两个相邻的重叠范围是可以接受的。

谁能用SQL算法帮助我生成此结果集吗?

编辑:目标平台数据库是SQL Server2005。日期记录为10/05/2009 00:00:00,这意味着事件在10/5/2009
00:00:00和10/5 /之间的某个时间结束2009 23:59:59。开始日期也是如此。因此,输入日期范围也可以读取为01/04/2009
00:00:00-30/06/2009 23:59:59。


问题答案:

展平相交时间跨度的功能略有变化SQL Server

  • 展平时间跨度:SQL Server

这是一种罕见的情况,其中基于游标的方法比基于集的方法SQL Server更快:

CREATE FUNCTION mytable(@p_from DATETIME, @p_till DATETIME)
RETURNS @t TABLE
        (
        q_type VARCHAR(20) NOT NULL,
        q_start DATETIME NOT NULL,
        q_end DATETIME NOT NULL
        )
AS
BEGIN
        DECLARE @qs DATETIME
        DECLARE @qe DATETIME
        DECLARE @ms DATETIME
        DECLARE @me DATETIME
        DECLARE cr_span CURSOR FAST_FORWARD
        FOR
        SELECT  startDate, endDate
        FROM    mytable
        WHERE   startDate BETWEEN @p_from AND @p_till
        ORDER BY
                startDate 
        OPEN    cr_span
        FETCH   NEXT
        FROM    cr_span
        INTO    @qs, @qe
        SET @ms = @qs
        SET @me = @qe
        WHILE @@FETCH_STATUS = 0
        BEGIN
                FETCH   NEXT
                FROM    cr_span
                INTO    @qs, @qe
                IF @qs > @me
                BEGIN
                        INSERT
                        INTO    @t
                        VALUES ('overlap', @ms, @me)
                        INSERT
                        INTO    @t
                        VALUES ('gap', @me, @qs)
                        SET @ms = @qs
                END
                SET @me = CASE WHEN @qe > @me THEN @qe ELSE @me END
        END
        IF @ms IS NOT NULL
        BEGIN
                INSERT
                INTO    @t
                VALUES  (@ms, @me)
        END
        CLOSE   cr_span
        RETURN
END
GO

此函数将每个连续范围的相交范围压缩为一个范围,并返回范围和后面的间隙。



 类似资料:
  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它:

  • 问题内容: 我有两个日期范围,每个范围都由开始日期和结束日期确定(显然,datetime.date()实例)。这两个范围可以重叠也可以不重叠。我需要重叠的天数。当然,我可以用两个日期范围内的所有日期预填充两个集合,并执行一个集合交集,但这可能效率不高…除了长距离的if- elif部分覆盖所有情况的解决方案,还有其他更好的方法吗? 问题答案: 确定两个开始日期中的最晚一个,以及两个结束日期中最早的一

  • 我有一张表,上面有房间的开始和结束日期。我写了这个SQL: 这些房间在这段时间内是有效的。但是,当我这样过滤的时候, 我没有结果。这些日期就像一个数组: 所以,你可以看到那个房间在2022-12-30是活动的,但我不能得到它。我怎么能那样做? 希望我能很好地表达自己。

  • 问题内容: 我有一张可以容纳一年中所有天/月的表 例如 我有一张表格,显示来自不同数据集的日期范围 例如 我如何比较这两个表以显示该特定月份的数据集中缺少哪些日期 对于上面示例中的数据集所在的示例,EG缺少日期范围01/09/2013-19/09/2013 谢谢你的帮助! 问题答案: 您可以使用CTE并通过以下方式编写查询:

  • 问题内容: 源表如下: 我想得到以下输出: 我必须使用循环来填充此表吗? 谢谢 问题答案: 您可以使用技巧来查询 演示

  • 问题内容: 给定以下日期: 和一个静态变量: 我需要创建一个数组,如: 周末除外。 不,这不是功课…出于某种原因,我今天无法直截了当。 问题答案: 对于PHP> = 5.3.0,请使用DatePeriod类。不幸的是,几乎没有记录。