2012-08-03 115 views
4

我有兩個變量包含日期。 DateStartDateEnd(在SQL中)。
我也有兩個DatePicker控件(在WinForm中)。
我從數據庫導入兩個日期,需要做一些棘手的事情。重疊日期的範圍

所以這兩個變量創建一個日期範圍和兩個日期選擇器創建另一個日期範圍。
如何檢查這些日期範圍是否與Sql查詢重疊?

E.g(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 | 
-------------------------------------------- 

我知道這是一個有點搞砸了,但我不知道該怎麼問這個。

回答

2

如果第一範圍的開始在第二範圍的結束之前且第一範圍的結束在第二範圍的開始之後,則兩個日期範圍重疊。所以:

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

A good explanation is this way

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 
+0

令人印象深刻。我贊成緊湊版本:-P – phadaphunk 2012-08-03 14:01:59