MySQL:使用时间表的查询?

时间:2011-10-31 12:03:00

标签: mysql sql timetable

在我正在进行的项目中,系统将员工的时间表存储在表中,其结构如下:

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:00 14:30 工作

  • id 2 的员工周一从 18:30 07:00 工作(基本上在周一到周二之间) ,晚上)

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

非常感谢任何有关如何解决此问题的建议。

2 个答案:

答案 0 :(得分:0)

可能类似于:

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

这将为您提供几分钟的工作时间。基本上,它增加了1440(一天中的分钟,或24小时* 60分钟/小时)到结束时间和开始时间之间的差异,并保持其余(模数)为1440.

现在为设计部分:

如果可以的话,重新设计你的桌子。你的桌子不需要连续一周的所有日子,这将使每周的时间非常繁琐。

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

employee_id | entrytime           | exittime
          1 | 2011-10-31 06:00:00 | 2011-10-31 14:30:00
          1 | 2011-11-01 06:00:00 | null
          2 | 2011-10-31 18:30:00 | 2011-11-01 07:00:00
          2 | 2011-11-01 21:00:00 | null

那样,你有:

  1. 完全访问MySQL中的所有日期和时间函数
  2. 容易计算持续时间
  3. 在不完整的时期轻松过滤

答案 1 :(得分:-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条件

来完成

There are four basic cases that u need to handle, A, B,C and D