sql >> Databáze >  >> RDS >> Sqlserver

Vypočítejte chybějící a překrývající se období mezi dvěma daty

Je to malá variace funkce pro zploštění protínajících se časových úseků v SQL Server :

Je to jeden z mála případů, kdy na SQL Server přistupuje kurzor založený na přístupu je rychlejší než na množině:

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

Tato funkce zkomprimuje každou souvislou sadu protínajících se rozsahů do jednoho rozsahu a vrátí rozsah i následující mezeru.



  1. ORA-00933:Příkaz SQL nebyl správně ukončen při mazání dvou tabulek současně

  2. Jedinečné omezení pro více tabulek

  3. Opakování svg obdélníků z databáze

  4. Porovnejte podobné/variace slov/přípon v MySQL