我有一個簡單的Web應用程序,用戶登錄和分配的時候都免費提供一些休假中的日期範圍,當他們想要一些日子過的一個日期範圍。這採取請求的形式。用戶A提供「Jan 01-Jan31」並且希望「May 01-May31」。SQL 2日期範圍重疊的天數
現在用戶B把在他們提供五月也想一月的請求。在這個例子中,請求匹配。
Requests Table
--------------
"User A", "20170101", "20170131", "20170501", "20170531"
"User B", "20170501", "20170531", "20170101", "20170131"
但是,我需要它比這更復雜一點。用戶不得提供或想整整兩個月,但具體的日期範圍,如:
用戶A提供Jan01-Jan31,但希望May20-May27
用戶B提供May15-May31,但希望Jan01-JAN05
在該示例中,它們都匹配得,然而我需要計算每個請求重疊的另一天的數量,如果該重疊數目> = X天(比如應用程序中設置常數的4天請求將只匹配)。
因此,每個請求都聯合在一起互相再次,(反對所有其他請求,每次請求比較),並需要有重疊天數來檢查匹配。
我發現了這個公式,提供是否有是重疊,但我似乎無法回來的那天算過:
where not (t1.startdate > t2.endate or t1.enddate < t2.startdate)
見SqlFiddle這裏:
-- DateGivingFrom, DateGivingTo
-- DateWantFrom, DateWantTo
Create table t (Id int, uid varchar(6),
dgf date, dgt date,
Dwf date, dwt date);
Insert into t values (1,"Human1","20170101","20170131","20170501","20170507");
Insert into t values (2,"Human2","20170501","20170531","20170120","20170125");
Select *, (select count(*) from t
where not (v.dgf > t.dwt or v.dgt < t.dwf))
as DatesOverlap,
("?") as OverlapDayCount
from t as v ;
注意
將有數百個用戶每做幾個請求,並且還我不會做這種計算每個T ime用戶提交請求,因爲它可能相當密集。相反,我會運行在「檢查」要做到這一點功能
服務(因爲它會再設置通知,發送電子郵件等,基於結果)這將是PHP在MySQL的基於運行。非常感謝。
我試圖計算何時用戶的請求與其他用戶的請求「匹配」。當用戶A提供某些用戶B想要的日子並且用戶B提供用戶A想要的某些日子時,將考慮「匹配」。這兩種情況都需要至少4天(應用常量)。我認爲這最好通過重疊的日期範圍在語義上顯示 – Jammo
我只是在SqlFiddle中玩這個。幾個拼寫錯誤(語法錯誤),但迄今似乎工作得很好,謝謝。如果我的測試不會標記任何東西,我會很快將其標記爲已接受 – Jammo
已接受。雖然我似乎無法編輯您的答案。我調整了一下,以符合我的要求。 '<' and '>'條件爲'<=' and '> =',同樣'd1.dwf'變爲't1.dwf'。此外,我已將差異更改爲'datedif(...)+ 1'以解釋同一天=重疊。還爲'gw_overlap> = 4'和'wg_overlap> = 4'添加了'having'子句。非常感謝! – Jammo