mysql 结果来自 table1,其中 table2 不匹配并且在 start_datetime 和 start_datetime + 8 小时之间

标签 mysql datetime join date-arithmetic

我想从表 employees 中查询员工 ID 列表,但排除已位于名为 employee_schedule 的单独表中的员工 ID如果它落在特定的 datetime 之间和同样的datetime + 8 hours 。由于其他原因,我没有使用日期时间来表示轮类结束。

SELECT user_id
FROM employees AS t1
LEFT OUTER JOIN employee_schedule AS t2 ON t1.user_id = t2.assigned_guard_id
WHERE t2.assigned_guard_id IS NULL
AND ('2017-10-23 18:00:00' BETWEEN t2.shift_start 
AND ADDTIME(t2.shift_start, '12:00:00'))

结果:

`employees` |  `employee_schedule`
----------------------------------------------------------------------------------------
id          |  guard_assigned_id, shift_start(datetime), shift_duration(INT, minutes)
----------------------------------------------------------------------------------------
17          |  17, '2017-10-23 18:00:00', '480'
19          |  
22          |
----------------------------------------------------------------------------------------

结果应仅显示 1922 ,因为 17 出现在 shift_start 之间的时间表中和shift_start + shift_duration .

我的查询返回 0 个结果。

最佳答案

您的范围条件正在将 LEFT JOIN 转换为 INNER JOIN。对于同一行,这两个条件永远不可能成立。您需要将第二个条件移至 LEFT JOIN 的 ON 子句。所以应该是:

SELECT user_id
FROM employees AS t1
LEFT OUTER JOIN employee_schedule AS t2
    ON  t1.user_id = t2.assigned_guard_id
    AND '2017-10-23 18:00:00' BETWEEN t2.shift_start
        AND ADDTIME(t2.shift_start, '12:00:00')
WHERE t2.assigned_guard_id IS NULL

请注意,引擎可能无法优化范围条件以使用索引。最好写成

AND t2.shift_start <= '2017-10-23 18:00:00'
AND t2.shift_start >= SUBTIME('2017-10-23 18:00:00', '12:00:00')

AND t2.shift_start BETWEEN SUBTIME('2017-10-23 18:00:00', '12:00:00')
    AND '2017-10-23 18:00:00'

如果您想使用shift_duration而不是恒定时间,您可以使用

AND t2.shift_start <= '2017-10-23 18:00:00'
AND t2.shift_start >= '2017-10-23 18:00:00' - INTERVAL shift_duration MINUTE

关于mysql 结果来自 table1,其中 table2 不匹配并且在 start_datetime 和 start_datetime + 8 小时之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732565/

相关文章:

spring - Spring Data 支持日历吗?

具有多个连接的 mysql SELECT 查询需要最新的表数据

mysql - 将一个表中的动态数量的条目存储到另一个表中的单行

python - 在 select 语句后提交时 pyodbc 内存泄漏

mysql - 更改所有列 WHERE 数据类型

javascript - .Net webApi ISO 日期时间和 IE8

Mysql - 从表 B 引用时需要获取表 A 的最新信息

sql - 如何在与 mysql 的同一查询中使用 SUM 和 COUNT 并获得准确的结果

mysql - Hibernate 数据库特定的 columnDefinition 值

javascript - 如何构建一个包含多个关键字的 Ajax 搜索栏?