2

在我现在正在处理的项目中,系统将员工的时间表存储在具有以下结构的表中:

employee_id | mon_h_s | mon_m_s | mon_h_e | mon_s_e | tue_h_s | tue_m_s | etc.
------------------------------------------------------------------------------
      1         06         00        14        30        06        00     ...
      2         18         30        07        00        21        00     ...

在哪里:

mon_h_s- 周一营业时间开始

mon_m_s- 星期一分钟开始

mon_h_e- 周一结束

mon_m_e- 星期一分钟结束

tue_...- 周二...

一周中的每一天都有 4 个字段:小时开始、分钟开始、小时结束、分钟结束。

所以,从上表我们可以看出:

  • id 为 1的员工在周一的06:0014:30工作

  • id 2的员工在周一18:3007:00工作(基本上是周一到周二晚上)

问题是我不确定如何创建一个考虑到包括时间重叠(在夜间)在内的所有内容的 SQL 查询。例如,我们需要查找周二早上 6 点(06:00)工作的员工。在我们的例子中,两个员工(id 1 和 id 2)都会满足这个标准。id 为 1 的员工在周二 06:00 开始工作,id 为 2 的员工工作到周二 07:00(不过从周一开始)。

任何有关如何解决此问题的建议将不胜感激。

4

2 回答 2

0

大概是这样的:

SELECT (1440 + ((mon_h_e*60)+mon_m_e) - ((mon_h_e*60)+mon_m_e)) % 1440

这将为您提供以分钟为单位的工作时间。基本上,它将结束时间和开始时间之间的差值增加 1440(一天中的分钟,或 24h*60min/h),并保持其余(模数)为 1440。

现在为设计部分:

如果可以的话,重新设计你的桌子。您的表格不必将一周中的所有日子都排成一排,这将使每周时间的统计变得非常乏味。

您应该考虑使用真实的日期时间。

员工编号 | 入场时间 | 退出时间
          1 | 2011-10-31 06:00:00 | 2011-10-31 14:30:00
          1 | 2011-11-01 06:00:00 | 空值
          2 | 2011-10-31 18:30:00 | 2011-11-01 07:00:00
          2 | 2011-11-01 21:00:00 | 空值

这样,你有:

  1. 完全访问 MySQL 中的所有日期和时间函数
  2. 轻松计算持续时间
  3. 轻松过滤不完整的时期
于 2011-11-01T16:18:14.323 回答
-2

您需要处理四种基本情况

A -> when time of lecture starts before given time
B -> when time of lecture starts after given time but falls within range of ending time
C -> when time of lecture starts within given time but ends after
D -> when time of lecture starts before given time and ends after given time

现在,这可以使用简单的 OR 条件来完成

您需要处理四种基本情况,A、B、C 和 D

于 2011-10-31T12:25:03.473 回答