这是我的工作表
ID WORK_ID DATE
1 5 2018-05-10
2 6 2018-05-12
3 5 2018-05-15
5 5 2018-05-16
6 6 2018-05-16
.
.
我有一个函数来计算日期之间的营业日名称kac_is_gunu($ date1,$ date2)工作正常。
我的问题是;这是一张有很多行的大桌子。我想找出每个work_id的每个日期之间的差异
例如,在此表中为work_id 5 kac_is_gunu(2018-05-15,2018-05-10) kac_is_gunu(2018-05-16,2018-05-15)
如何从此表中获取此类日期到我的代码?
这是我想要的结果;
2018-05-16 - 2018-05-15 (Pair 1 of work_id 5)
2018-05-15 - 2018-05-10 (Pair 2 of work_id 5)
2018-05-16 - 2018-05-12 (Pair 1 of work_id 6)
.
.

稍后我将计算日期之间的营业日
我这样做的原因是;我只有工作结束日期作为日期一旦完成工作它意味着下一个开始所以工作的开始日期是上一个结束
答案 0 :(得分:0)
这是你可以选择所有对的方法:
select t1.ID as t1ID, t2.ID as t2ID, t1.WORK_ID as, datediff(t2.`DATE`, t1.`DATE) as delta
from Work t1
join Work t2
on t1.WORK_ID = t2.WORK_ID and t1.`ID` < t2.`ID`
但是你确定要选择所有对而不是彼此连续的对吗?
修改
初始查询选择了所有对,现在我们将看看如何选择连续项:
select t1.ID as t1ID, t2.ID as t2ID, t1.WORK_ID as, datediff(t2.`DATE`, t1.`DATE) as delta
from Work t1
join Work t2
on t1.WORK_ID = t2.WORK_ID and t1.`ID` < t2.`ID`
where not exists
(select 1
from Work t3
where t1.`ID` < t3.`ID` and t3.`ID` < t2.`ID` and t1.WORK_ID = t3.WORK_ID)
请注意,查询与初始查询的相似之处在于查找具有类似WORK_ID
的对,其中t1。ID
&lt; t2。ID
但我们添加了一个附加条件,即不存在符合某些条件的记录。标准是第三条记录的ID
介于ID
和t1
的{{1}}之间,并且具有相似的t2
。当然,您可以跳过WORK_ID
与ID
比较的比较。
答案 1 :(得分:0)
SELECT x.date start_date
, MIN(y.date) end_date
FROM my_table x
JOIN my_table y
ON y.work_id = x.work_id
AND y.date > x.date
WHERE x.work_id = 5
GROUP
BY x.date;
...可以扩展到(未经测试)......
SELECT x.*
, 5 * (DATEDIFF(LEAST(x.end_date,LAST_DAY(x.start_date)), x.start_date) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(x.start_date) + WEEKDAY(x.end_date) + 1, 1) total
FROM
(
SELECT a.date start_date
, MIN(b.date) end_date
FROM my_table a
JOIN my_table b
ON b.work_id = a.work_id
AND b.date > a.date
WHERE a.work_id = 5
GROUP
BY a.date
) x