sql >> データベース >  >> RDS >> Sqlserver

日付範囲の重複チェック制約

    CHECKは後に実行されます 行が挿入されているため、範囲がそれ自体と重複しています。

    WHEREを修正して、次のようなものを含める必要があります:@MyTableId <> MyTableId

    ところで、WHERE式は単純化できます。

    範囲しない 次の場合に重複:

    • 一方の範囲の終了は、もう一方の範囲の開始前です
    • または 一方の範囲の開始は、もう一方の範囲の終了後です。

    これは次のようにSQLで記述できます:

    WHERE @DateEnd < DateStart OR DateEnd < @DateStart
    

    それを否定して、実行する範囲を取得します オーバーラップ...

    WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
    

    ...ドモルガンの法則によれば、これは...

    WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
    

    ...これは次と同じです:

    WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
    

    したがって、最終的なWHEREは次のようになります。

    WHERE
        @MyTableId <> MyTableId
        AND @DateEnd >= DateStart
        AND DateEnd >= @DateStart
    

    [SQLフィドル]

    注:範囲を「タッチ」できるようにするには、<=を使用します 開始式で、>を生成します 最終的な表現で。



    1. ネイティブ動的SQLを使用して実行されたSELECTステートメントの結果を出力するにはどうすればよいですか?

    2. List<モデルクラス>をsqliteに保存します

    3. MariaDBでのNVL()の仕組み

    4. PostgresLeftはwhere条件で結合します