首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于确定重叠时间戳的MySQL查询-时间表系统

用于确定重叠时间戳的MySQL查询-时间表系统
EN

Stack Overflow用户
提问于 2016-07-12 03:33:44
回答 0查看 439关注 0票数 0

我有一个表,用于存储员工的轮班记录。

简单地说,这里有以下数据:

代码语言:javascript
复制
id = Shift ID
employeenum = Employee Number
start = unix timestamp of shift start time
end = unix timestamp of shift end time
date = YYYY-mm-dd description of date the shift starts on
status = shift status (numeric status identifier)

我目前正在通过一个循环的php脚本来确定冲突,但它太慢了。我已经搜索了其他问题,但找不到我想要的答案。

我正在尝试提出一个查询,它基本上会给出一个在给定时间段内具有冲突班次的员工列表。

即2016-07-03至2016-07-10期间,员工具有重叠的状态值为1或7的班次的开始和结束时间戳。

任何帮助都将不胜感激。

谢谢!

编辑

This本质上是表结构。

id是一个主自增量键。该表充满了数字数据。

ID是自动递增的数字,employeenum是6位数字,开始和结束是unix时间戳,日期是YYYY-mm-dd日期格式,覆盖是1或0,状态是1、2、3、4、5、6或7。

Current循环通过查询来工作:

代码语言:javascript
复制
SELECT *  FROM schedule WHERE overridden =0 AND date >=$startdate AND date <= $enddate AND (status = 1 OR status = 7)  AND employeenum != 0 ORDER BY date ASC

然后循环遍历所有这些返回的移位,通过反复执行此查询(使用上面查询结果返回的startend值)来测试另一个移位是否与它们冲突:

代码语言:javascript
复制
SELECT `employeenum` FROM `schedule` WHERE `overridden` =0 AND `date` >= '$startdate' AND `date` <= '$enddate' AND (`status` = '1' OR `status` = '7') AND ((('$start' > `start`) AND ('$start' < `end`)) OR ((`end` > '$start') AND (`end` < '$end'))) AND `employeenum` = '$employee';"

如果有结果,它会将雇员编号推送到有冲突的雇员数组中。然后,这将防止循环再次检查该员工。

在任何给定时间都可能有10,000条记录,因此它正在执行10,000+查询。这些记录仅表示100-200名员工,因此我正在寻找一种方法来查询一次,以查看一个employeenum的两个date值之间是否有任何重叠(startend与另一个startend重叠)记录,而不必查询数据库10,000次。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38314787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档