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

Sprawdzanie nakładania się przedziałów czasowych, problem strażnika [SQL]

Oto sposób na spłaszczenie takiego zakresu dat

Start          | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00

Musisz porównać poprzednie i następny daty w każdym wierszu i sprawdź, czy

  • Początek bieżącego wiersza data wypada między zakresem dat poprzedniego wiersza.
  • Koniec bieżącego wiersza data wypada między zakresem dat następnego wiersza.

Korzystając z powyższego kodu, implementacja UDF jest tak prosta, jak poniżej.

create function fnThereIsWatchmenBetween(@from datetime, @to datetime)
returns bit
as
begin
    declare @_Result bit

    declare @FlattenedDateRange table (
        Start   datetime,
        [End]   datetime
    )

    insert  @FlattenedDateRange(Start, [End])
    select  distinct 
            Start = 
                case 
                    when Pv.Start is null then Curr.Start 
                    when Curr.Start between Pv.Start and Pv.[End] then Pv.Start
                    else Curr.Start 
                end,
            [End] = 
                case 
                    when Curr.[End] between Nx.Start and Nx.[End] then Nx.[End] 
                    else Curr.[End] 
                end
    from    shift Curr
            left join shift Pv on Pv.ID = Curr.ID - 1 --; prev
            left join shift Nx on Nx.ID = Curr.ID + 1 --; next

    if exists(  select  1
                from    FlattenedDateRange R
                where   @from between R.Start and R.[End]
                        and @to between R.Start and R.[End]) begin
        set @_Result = 1    --; There is/are watchman/men during specified date range
    end
    else begin
        set @_Result = 0    --; There is NO watchman
    end

    return @_Result
end


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak poprawnie łączyć kolumny za pomocą T-SQL?

  2. Plan oparty na zestawach działa wolniej niż funkcja o wartości skalarnej z wieloma warunkami

  3. Używanie wyrażenia regularnego w ramach procedury składowanej

  4. Czy połączenia między widokami a tabelą mogą negatywnie wpłynąć na wydajność?

  5. Jak mogę zobaczyć wszystkie znaki specjalne dozwolone w polu varchar lub char w programie SQL Server?