2017-04-01 40 views
0

我有一個簡單的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的基於運行。非常感謝。

回答

2

的基本思想是自聯接。我不確定你真的想要計算什麼。以下計算兩個時段的重疊:「g」到「w」,然後「w」到「g」。

select t1.*, t2.*, 
     datediff(least(t1.dgt, t2.dwt) greatest(t1.dgf, t2.dwf)) as gw_overlap, 
     datediff(least(t2.dgt, t1.dwt) greatest(t2.dgf, t1.dwf)) as wg_overlap; 
from t t1 join 
    t t2 
    on t1.dgf <= t2.dwt and t1.dgt >= t2.dwf and -- t1 "g" overlaps t2 "w" 
     t2.dgf <= t1.dwt and t2.dgt >= t1.dwf and 
     t1.uid <> t2.uid; 
+0

我試圖計算何時用戶的請求與其他用戶的請求「匹配」。當用戶A提供某些用戶B想要的日子並且用戶B提供用戶A想要的某些日子時,將考慮「匹配」。這兩種情況都需要至少4天(應用常量)。我認爲這最好通過重疊的日期範圍在語義上顯示 – Jammo

+0

我只是在SqlFiddle中玩這個。幾個拼寫錯誤(語法錯誤),但迄今似乎工作得很好,謝謝。如果我的測試不會標記任何東西,我會很快將其標記爲已接受 – Jammo

+0

已接受。雖然我似乎無法編輯您的答案。我調整了一下,以符合我的要求。 '<' and '>'條件爲'<=' and '> =',同樣'd1.dwf'變爲't1.dwf'。此外,我已將差異更改爲'datedif(...)+ 1'以解釋同一天=重疊。還爲'gw_overlap> = 4'和'wg_overlap> = 4'添加了'having'子句。非常感謝! – Jammo