sql >> データベース >  >> RDS >> Sqlserver

2つの日付の間で欠落している日付範囲と重複する日付範囲を計算します

    SQL Serverで交差するタイムスパンをフラット化するのは、関数の少しのバリエーションです。 :

    これは、SQL Serverでのカーソルベースのアプローチのまれなケースの1つです。 セットベースのものの方が高速です:

    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
    

    この関数は、交差する範囲の連続する各セットを1つの範囲に圧縮し、範囲と次のギャップの両方を返します。



    1. Laravel-テーブルを動的に作成する(移行なし)

    2. Postgres:値の合計を選択してから、これをもう一度合計します

    3. 最後の個別のレコードセットを取得する

    4. MySQLは、変更が発生したときに通知を受け取ることができるように、Cでのコールバックを許可していますか?