4

日付を含む 2 つの変数があります。DateStartおよびDateEnd(SQL で)。
またDatePicker、(WinForm 内に) 2 つのコントロールがあります。
データベースから 2 つの日付をインポートして、何かトリッキーなことをする必要があります。

したがって、2 つの変数は日付の範囲を作成し、2 つの日付ピッカーは別の日付の範囲を作成します。
これらの日付範囲が SQL クエリと重複しているかどうかを確認するにはどうすればよいですか?

例 (yyyy/mm/dd 形式)

DateStart = 2012/07/01DateEnd = 2012/07/31

| DatePicker1  | DatePicker2 | Overlapping | 
--------------------------------------------
| 2012/07/15   | 2012/07/16  |    True     |
--------------------------------------------
| 2012/07/31   | 2012/08/01  |    True     |
--------------------------------------------
| 2012/06/20   | 2012/07/01  |    True     |
--------------------------------------------
| 2012/08/01   | 2012/09/01  |    False    |
--------------------------------------------

少し混乱していることは知っていますが、他にどのように質問すればよいかわかりませんでした。

4

2 に答える 2

3

最初の範囲の開始が 2 番目の範囲の終了より前で、最初の範囲の終了が 2 番目の範囲の開始より後にある場合、2 つの日付範囲が重複しています。そう:

where DateStart <= @DatePicker2
  and DateEnd >= @DatePicker1

良い説明は、この方法です。

于 2012-08-03T13:53:35.370 に答える
0

この機能を使用する

/* 
 * Tests if two given periods overlap each other.
 *
 * @TS Test period start
 * @TE Test period end
 * @BS Base period start
 * @BE Base period end
 */
CREATE FUNCTION [fn_DateTime_Overlap]
(
    @TS DATETIME = NULL,
    @TE DATETIME = NULL,
    @BS DATETIME = NULL,
    @BE DATETIME = NULL
)
RETURNS BIT
AS
BEGIN
    -- More simple?
    -- return !((TS < BS && TE < BS) || (TS > BE && TE > BE));
    -- The version below, without comments 
    -- (TS >= BS && TS < BE) || (TE <= BE && TE > BS) || (TS <= BS && TE >= BE)
    IF (
        -- 1. Case:
        --       TS-------TE
        --    BS------BE
        -- TS is after BS but before BE
        (@TS >= @BS AND @TS < @BE)
        -- 2. Case
        --    TS-------TE
        --        BS---------BE
        -- TE is before BE but after BS
        OR (@TE <= @BE AND @TE > @BS)
        -- 3. Case
        --  TS----------TE
        --     BS----BE
        -- TS is before BS and TE is after BE
        OR (@TS <= @BS AND @TE >= @BE)
    ) RETURN 1
    RETURN 0
END
于 2012-08-03T13:59:33.603 に答える