sql >> Database >  >> RDS >> Sqlserver

Controleren op overlap in tijdsbereik, het watchman-probleem [SQL]

Hier is een manier om het datumbereik op deze manier af te vlakken

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

Je moet vorige . vergelijken en volgende datums in elke rij en kijk of

  • Huidige Start . van de huidige rij datum valt tussen het datumbereik van de vorige rij.
  • Huidige Einde . van de huidige rij datum valt tussen het datumbereik van de volgende rij.

Met behulp van bovenstaande code is het implementeren van UDF zo eenvoudig als volgt.

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. Moeilijkheden bij het installeren van mysql gem op Ubuntu

  2. cursor loop en continue instructie:onverwacht gedrag

  3. Oracle 2 koppeltekens in cijferkolom?

  4. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException Mysql-fout invoegen