2012-08-03 3 views
4

날짜가 포함 된 두 개의 변수가 있습니다. DateStartDateEnd (SQL에서)
또한 두 개의 DatePicker 컨트롤 (WinForm)이 있습니다.
데이터베이스에서 두 날짜를 가져 오는데 까다로운 작업이 필요합니다.날짜 범위가 겹침

따라서 두 변수는 날짜 범위를 만들고 두 날짜 선택 도구는 다른 날짜 범위를 만듭니다.
이러한 날짜 범위가 Sql 쿼리와 겹치는 지 어떻게 확인할 수 있습니까?

예컨대 (YYYY/MM/DD 형식)

DateStart = 2012/07/01 , DateEnd = 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