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. MySQLはいつ列のインデックスを更新しようとしますか?

    2. クラス内のPDOプリペアドステートメント

    3. リレーショナルデータベース

    4. lastInsertIdを1つのテーブルから別のテーブルに同時にまたは同時に挿入するための可能な方法