Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Проверка за припокриване на времевия диапазон, проблемът с пазача [SQL]

Ето начин за изравняване на диапазон от дати по този начин

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

Трябва да сравните предишния и следващ дати във всеки ред и вижте дали

  • Начало на текущия ред датата попада между диапазона от време на предишния ред.
  • Край на текущия ред датата попада между диапазона от време на следващия ред.

С помощта на горния код внедряването на UDF е толкова просто, колкото следва.

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. SQL IN клауза в съхранена процедура

  2. Премахване на акаунт в база данни за поща от профил (SSMS)

  3. КРЪСТОСНО ПРИЛАГАНЕ към пространство от имена, подвъзлите връщат дублирани записи

  4. Как да импортирам sql файл с данни в SQL Server?

  5. Изберете горния 1 ред от всяка група