2016-11-25 50 views
0

我有一個叫優惠表,其中我有幾個報價:MySQL的複雜與檢查日期

ID | List Name | Arrival | Depart  | Price 
1 | Plus  | 12 August | 18 August | $ 100.00 
2 | Plus  | 19 August | 25 August | $ 120.00 
3 | Plus  | 26 August | 1 September | $ 80.00 
4 | Weekend | 11 August | 13 August | $ 50.00 
5 | Weekend | 18 August | 20 August | $ 60.00 
6 | Weekend | 25 August | 27 August | $ 40.00 

然後,我在我的酒店,有入住和退房日期客人。

需要找到所有帶有相同列表名稱的優惠,這些優惠涵蓋了我度假客人的所有日子(從入住日期到結帳日期)。

例 如果我的客人花費他的時間在我的酒店從8月13日到8月20日,我需要如果我的客人從他花費時間在我的酒店僅返回ID爲1和2

8月13日到8月27日,我只需要返回ids 1,2和3。這是因爲6和7僅包含週末,而不是入住和退房日期之間的所有日子。

如果我的客人花費他的時間在我的酒店從8月18日到8月20日我需要返回只有ID爲1,2和5

+0

等待...你有一個_HTML_表或SQL表? –

+0

這是一個SQL表,我用HTML只是爲了讓你的人以更好的方式檢查表... – prelite

+2

這不是一個更好的方法。請編輯該問題,以便它實際上顯示爲SQL表格。 –

回答

0

您正在尋找的邏輯是這樣的:

select o.* 
from offers o 
where o.arrival <= $arrival and o.depart >= $depart; 

$arrival$depart是您的客人的日期。

+0

這並不是那麼簡單,我改變了一些東西,請再讀一遍主要信息。我對此表示歉意...... – prelite

0

你需要做這樣的事情:

​​

的MySQL 5.6架構設置

CREATE TABLE offers 
    (`ID` int, `Arrival` date, `Depart` date, `Price` float) 
; 

INSERT INTO offers 
    (`ID`, `Arrival`, `Depart`, `Price`) 
VALUES 
    (1, '2016-08-12', '2016-08-18', 100.00), 
    (2, '2016-08-19', '2016-08-25', 120.00), 
    (3, '2016-08-26', '2016-09-01', 80.00), 
    (4, '2016-08-11', '2016-08-13', 50.00), 
    (5, '2016-08-18', '2016-08-20', 60.00), 
    (6, '2016-08-25', '2016-08-27', 40.00) 
; 

查詢1

select * 
from offers 
where (((arrival >= '2016-08-13' and arrival <= '2016-08-20') or 
     (depart >= '2016-08-13' and depart <= '2016-08-20')) 
     and datediff(depart,arrival) = 6) 
or 
(arrival = '2016-08-13' and depart = '2016-08-20' 
and datediff(depart,arrival) = 2) 

Results

| ID |     Arrival |     Depart | Price | 
|----|--------------------------|--------------------------|-------| 
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 | 
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 | 

查詢2

select * 
from offers 
where (((arrival >= '2016-08-13' and arrival <= '2016-08-27') or 
     (depart >= '2016-08-13' and depart <= '2016-08-27')) 
     and datediff(depart,arrival) = 6) 
or 
(arrival = '2016-08-13' and depart = '2016-08-27' 
and datediff(depart,arrival) = 2) 

Results

| ID |     Arrival |      Depart | Price | 
|----|--------------------------|-----------------------------|-------| 
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 | 
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 | 
| 3 | August, 26 2016 00:00:00 | September, 01 2016 00:00:00 | 80 | 

查詢3

select * 
from offers 
where (((arrival >= '2016-08-18' and arrival <= '2016-08-20') or 
     (depart >= '2016-08-18' and depart <= '2016-08-20')) 
     and datediff(depart,arrival) = 6) 
or 
(arrival = '2016-08-18' and depart = '2016-08-20' 
and datediff(depart,arrival) = 2) 

Results

| ID |     Arrival |     Depart | Price | 
|----|--------------------------|--------------------------|-------| 
| 1 | August, 12 2016 00:00:00 | August, 18 2016 00:00:00 | 100 | 
| 2 | August, 19 2016 00:00:00 | August, 25 2016 00:00:00 | 120 | 
| 5 | August, 18 2016 00:00:00 | August, 20 2016 00:00:00 | 60 | 
+0

您可以將'(2016-08-13'和'2016-08-20'之間到達或'2016-08-13'和'2016-08-20'之間) '((arrival> ='2016-08-13'and arrival <='2016-08-20')or(depart> ='2016-08-13'且出發<='2016-08-20 '))' –

+0

常量6和2代表什麼? – prelite

+0

它用於確定報價是否只用於一個星期。據我所知,週末優惠只適用於那些參加週末活動的人(你的第三個例子) –