我有一个简单的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