2014-12-11 2 views
0

저는 price_table을 가지고 있는데, start_date와 end_date (판촉 가격의 경우)의 두 열이 있습니다.MySQL의 다른 날짜 범위 내에 주어진 날짜 범위가 있는지 찾으십시오.

주어진 날짜 범위가 이미 존재하는 다른 범주에 속하지 않는지 확인하는 쿼리를 만들려고합니다.

SELECT * 
FROM tbl_preco 
WHERE isActive = 1 AND (start_date between '2014-12-11 15:45:00' AND '2014-12-13 11:45:00' 
     OR end_date between '2014-12-11 15:45:00' AND '2014-12-13 11:45:00') 

문제는 다음과 같습니다 :이 쿼리를 사용하려고했습니다

하더라도, 그것을 잡고있다 그래서 2014-12-10 15:30:00에서 2014-12-13 14:30:00에 프로모션 가격, 설명 BETWEEN 둘 중 어느 것도이있다 주어진 범위는 실제로 DB의 범위 안에 있습니다.

    |------GIVEN RANGE-------| 
     |-------- RANGE IN DB --------| 

위의 예는 TRUE로 반환해야하며, 응용 프로그램이 이미 주어진 범위 내에서 프로모션 가격가 있음을 사용자에게 알려줍니다.

+0

이지만 2014-12-10 15:30:00은 '2014-12-11 15:45:00'및 '2014-12-13 11:45:00' 및 2014-12-13 사이에 없습니다. 14:30:00은 '2014-12-11 15:45:00'과 '2014-12-13 11:45:00'사이가 아닙니다. 값을 반환하지 않으므로 문제가 발생하지 않습니다. 저 – BredeBS

+0

@BredeBasualdoSerraino, 물론, 그리고 그것은 정확히 내가 말한 것입니다. 문제는 두 범위가 충돌한다는 것입니다. 시작 날짜와 종료 날짜가 주어진 값 사이에 있지는 않지만 범위가 동시에 발생하고 있으므로 이런 일이 발생하지 않아야합니다. –

+0

날짜 범위 중 하나가 완전히 다른 날짜 범위에 포함될 때이를 감지해야한다고 생각합니다. 편집과 함께 – axiac

답변

3

범위 내에서 활성화 된 프로모션 판매가 필요하신 것 같습니다. 이 경우 시작일과 종료일이 현재 수행중인 범위에 있는지 확인할 필요가 없습니다. 범위가 닫히기 전에 시작 날짜가 발생했는지 확인한 다음 범위가 열린 후에 종료 날짜가 발생했는지 확인해야합니다. 희망이 맞는가?

SELECT * 
FROM tbl_preco 
WHERE isActive = 1 
AND start_date < '2014-12-13 11:45:00' 
AND end_date > '2014-12-11 15:45:00'; 
+0

너희들을 사랑해! : D –

+0

기간이 2014-12-10에서 2014-12-14 사이 인 경우 – sanu

1

간단한 조건 두 세그먼트 [A, B] 및 [C, D]가 서로 교차하는 경우이다 (a-d)*(b-c) <= 0 알아낼. 한 날짜 범위 (세그먼트)가 시작되거나 다른 기간 동안 만 끝나고 하나가 다른 세그먼트에 완전히 포함될 때 상황을 모두 포함합니다. 당신은 숫자 (유닉스 타임 스탬프)로 변환 할 필요가 날짜 사용하여 MySQL의에서이를 구현하기 위해

:

SELECT * 
FROM tbl_preco 
WHERE isActive = 1 
    AND (UNIX_TIMESTAMP(start_date) - UNIX_TIMESTAMP('2014-12-11 15:45:00')) 
    * (UNIX_TIMESTAMP(end_date) - UNIX_TIMESTAMP('2014-12-13 11:45:00')) <= 0 
; 

제품이 날짜 범위를 0 중 하나입니다

가 다른에 포함됩니다 (함께 시작 또는 함께 끝남) 또는 다른 끝나면 그 중 하나가 정확히 시작됩니다.

관련 문제