在我正在进行的项目中,系统将员工的时间表存储在表中,其结构如下:
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(周一开始)。
非常感谢任何有关如何解决此问题的建议。
答案 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 :(得分:-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条件
来完成