2017-04-01 112 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