Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Oblicz brakujące zakresy dat i nakładające się zakresy dat między dwiema datami

Jest to mała odmiana funkcji spłaszczania przecinających się przedziałów czasowych w SQL Server :

Jest to jeden z rzadkich przypadków, gdy podejście oparte na kursorze w SQL Server jest szybszy niż ten oparty na zestawie:

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

Ta funkcja kompresuje każdy ciągły zestaw przecinających się zakresów w jeden zakres i zwraca zarówno zakres, jak i następną przerwę.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najbardziej elegancki sposób generowania permutacji na serwerze SQL

  2. Dlaczego w moich wartościach w kolumnie IDENTITY są luki?

  3. Korzystanie z DMV ( Dynamic Management View ) i DMF ( Dynamic Management Function ) | Rozwiązywanie problemów z wydajnością serwera SQL -4

  4. Jak mapować wiele partycji do jednej grupy plików w programie SQL Server (T-SQL)

  5. Co to jest domyślne ograniczenie w programie SQL Server — samouczek dotyczący programu SQL Server / TSQL — część 90