![](/img/trans.png)
[英]Deal with open intervals when finding if a given date range is inside another date range?
[英]Find if given date range inside another date range in MySQL
我有一個price_table,其中有兩列:start_date和end_date(用於促銷價格)。
我正在嘗試創建一個查詢,該查詢將檢查給定的日期范圍是否不屬於另一個已經存在的日期范圍。
我一直在嘗試使用以下查詢:
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
有促銷價格,因此即使指定的范圍實際上在D B。
|------GIVEN RANGE-------|
|-------- RANGE IN DB --------|
上面的示例應返回為TRUE,應用程序將告訴用戶在給定范圍內已經有促銷價格。
聽起來您想在此范圍內進行任何促銷銷售。 在這種情況下,您無需檢查范圍中是否存在開始日期和結束日期,這就是您正在執行的操作。 您只需要檢查開始日期是否在范圍關閉之前發生,然后檢查結束日期是否在范圍打開之后發生。 希望這有意義嗎?
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';
找出兩個段[a,b]和[c,d]是否相交的簡單條件是(ad)*(bc) <= 0
。 它涵蓋了所有情況,當一個日期范圍(段)僅在另一日期范圍內開始或僅在另一日期范圍內結束時,以及其中一個日期范圍完全包含在另一個日期范圍內時。
為了使用日期在MySQL中實現此功能,您需要將它們轉換為數字(Unix時間戳):
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時,日期范圍之一將包含在另一個范圍內(一起開始或一起結束),或者其中一個恰好在另一個結束時開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.