sql >> Databasteknik >  >> RDS >> Sqlserver

Beräkna saknade datumintervall och överlappande datumintervall mellan två datum

Det är en liten variation av funktionen för att platta ut korsande tidsperioder i SQL Server :

Det är ett av de sällsynta fallen när markörbaserad tillvägagångssätt i SQL Server är snabbare än en uppsättningsbaserad:

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

Den här funktionen komprimerar varje sammanhängande uppsättning av skärande intervall till ett intervall och returnerar både intervallet och följande gap.



  1. Mysql:Hur anropar jag en sql-skriptfil från en annan sql-skriptfil?

  2. Hur man skickar en array av strängar från C# till en Oracle-lagrad procedur

  3. Oracle SQL-fråga för datumformat

  4. Exempel på att flytta från MySQL till NoSQL?