【问题标题】:MySQL query to know schedule complianceMySQL 查询以了解计划合规性
【发布时间】:2018-07-23 00:34:01
【问题描述】:

我有一张 Works 表,其中包含 start_dateend_date 列> 是日期时间类型和 qtty tinyint。为了涵盖这些作品,我得到了另一个名为 Turns 的表格,其中包含 start_turnend_turn两种日期时间类型。

作品需要为大于或等于 qtty 的人数(被分配轮数)覆盖,但轮数不一定需要从 works.start_dateworks.end_date

我需要知道的是,这些作品是否得到了适当的报道,我的意思是这些作品是否总是为来自 的至少 qtty 人提供报道start_dateend_date

例如:案例 1

工作 => 开始日期 = 2018-07-01 10:00 | 结束日期 = 2018-07-01 22:00 | 数量 = 2
转身 =>
人 A:start_turn = 2018-07-01 10:00 | end_turn = 2018-07-01 22:00
B 人:start_turn = 2018-07-01 10:00 | end_turn = 2018-07-01 16:00
C 人:start_turn = 2018-07-01 16:00 | end_turn = 2018-07-01 22:00

案例 2

工作 => 开始日期 = 2018-07-01 10:00 | 结束日期 = 2018-07-01 22:00 | 数量 = 2
转身 =>
人 A:start_turn = 2018-07-01 10:00 | end_turn = 2018-07-01 22:00
B 人:start_turn = 2018-07-01 16:00 | end_turn = 2018-07-01 22:00
C 人:start_turn = 2018-07-01 16:00 | end_turn = 2018-07-01 22:00

看到第一种情况,我们可以解决它,只需提取工作的分钟数乘以 qtty,然后将该值与每个回合的分钟数总和进行比较,然后答案是肯定的,工作被正确覆盖。但是将这种方法应用于第二种情况,答案也是肯定的,但这是不正确的,因为从 start_date结束日期

我怎么做到的?任何帮助将不胜感激。

编辑

这是正确的 SQL Fiddle:http://sqlfiddle.com/#!9/c53d1b

【问题讨论】:

  • 好的,我添加了一个 SQL 小提琴。
  • sqlfiddle.com/#!9/ef328b/4 ... 或类似的东西
  • 感谢草莓的回复。但是很抱歉,我在 SQL Fiddle 中插入语句的外键出错了。我刚刚更新了 SQL Fiddle,如果你能再次看到它会很棒。
  • 错误出现在“CASE 2”之前:insert into turns values (4, 1, '2018-08-01 10:00', '2018-08-01 22:00'); 现在:insert into turns values (4, 2, '2018-08-01 10:00', '2018-08-01 22:00');

标签: mysql sql datetime timestamp


【解决方案1】:

不是答案;评论太长了:

Case 1 : Qtty = 2


   10 11 12 13 14 15 16 17 18 19 20 21 22
A  |------------------------------------|
B  |------------------|
C                     |-----------------|

Case 2 : Qtty = 2

   10 11 12 13 14 15 16 17 18 19 20 21 22
A  |------------------------------------|
B                     |-----------------|
C                     |-----------------|

案例2似乎满足了“这些作品不一定需要从works.start_date到works.end_date”的要求

【讨论】:

  • 没错,但案例 2 不满足从works.start_date 到works.end_date 至少覆盖Qtty=2 人的要求,我一直介意从头到尾。
  • 好的,但这似乎与前面的说法相矛盾。
  • 这些陈述并不矛盾,只是看到案例 1、B 和 C 没有完整的转弯,但工作总是至少有两个人。
  • 我想你的意思是说'没有人涵盖一定涵盖整个术语,但至少有 qtty 个人涵盖完整术语'
  • 这正是我们的目标。也许我写错了“那些作品不一定需要从works.start_date覆盖到works.end_date”,而必须是“回合不一定必须是完整的回合”。
【解决方案2】:

不是一个完整的答案,只是一个粗略的想法。

为了解决这个问题,您必须跳出框框思考问题,并以稍微不同的方式来表述问题。

  1. 首先,您需要列出所有关于 您的工作间隔及其对应的轮次/班次
  2. 然后您必须删除重复项 - 即只保留不同的时间点
  3. 然后你必须建立一个列表,其中包含这些时间点之间的所有时间间隔 - 如果你有 N 个时间点,你将有 N-1 个间隔
  4. 那么对于上述每个区间,您需要计算有多少/班次完全包含此区间
  5. 如果对于上述间隔中的 每个,您至少有 qtty 覆盖轮次 - 那么这项 工作 完全被轮班覆盖,否则不是

让我们以您的两个示例为例。对于案例 1,您有 3 个时间点 - 10、16、22。这意味着 2 个间隔 - 从 10 到 16 和从 16 到 22。对于第一个间隔,您有 2 圈完全包含间隔 - A 和 B。对于第二个间隔你有 2 圈完全包含间隔 - A 和 C。

对于案例 2,您有相同的时间点和相同的子间隔。但是,这一次,对于间隔 10-16,您只有 1 个完全包含间隔的转弯 - 转弯 A。因此,对于这种情况,您的 工作 并没有被所需的 转弯次数完全覆盖。

我仍然不确定如何在单个 SQL 查询中实现这一点 - 也许您必须从​​存储过程开始,使用循环以程序方式执行操作,然后在您获得更好的理解时对其进行改进的想法。

更新

这里有一些 SQL 可以为您提供初步的近似值,您可以根据自己的喜好对其进行调整 (http://sqlfiddle.com/#!9/72e841/3):

select * from
  (select p_start,p_end,qty -
    (select count(*) from turns 
      where start_turn <= p_start 
        and end_turn >= p_end
    ) as non_covered
   from
   (select pt, @start:=@end AS p_start, @end:=pt AS p_end 
     from
     (select start_date as pt from work where id=1
      union 
      select end_date as pt from work where id=1
      union 
      select start_turn from turns, work 
        where work.id=1 
          and start_turn between start_date and end_date
      union 
      select end_turn from turns, work 
        where work.id=1 
          and start_turn between start_date and end_date
     ) as tmp
     order by pt
   ) as period
   join work on work.id = 1
   where p_start <> p_end
  ) as cover
  where non_covered > 0

【讨论】:

  • 感谢 IVO,这是个好主意。我习惯使用存储过程,但我从来没有使用循环,你觉得性能如何?我必须实时显示此信息,以查看员工是否分配妥当。
  • 您首先需要构建一个返回正确结果的解决方案 - 然后才考虑如何优化它。第 1 点和第 2 点是一个带有 DISTINCT 的子查询,第 3 点需要一个窗口函数来访问上述子查询中的上一行,第 4 点是包含上述子查询并查找相关转折的外部查询,第 5 点是正确的>= 测试的一侧(第 4 点是左侧)。这是一个不平凡的查询,但一旦你知道算法,肯定可以实现
  • 能否请您提出您提到的整个查询?我有点困惑,我还没有得到它。
  • 非常感谢 IVO,它就像一个魅力。你太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2021-11-16
  • 2014-05-29
相关资源
最近更新 更多