【问题标题】:mysql result from table1 where table2 doesn't match AND between start_datetime and start_datetime + 8 hours来自 table1 的 mysql 结果,其中 table2 在 start_datetime 和 start_datetime + 8 小时之间不匹配
【发布时间】:2018-05-23 18:34:49
【问题描述】:

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

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_startshift_start + shift_duration 之间的计划中。

我的查询返回 0 个结果。

【问题讨论】:

    标签: mysql datetime join date-arithmetic


    【解决方案1】:

    您的范围条件是将 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
    

    【讨论】:

    • 这正是我几天来一直在努力解决的问题!感谢您提供包含替代选项的非常简洁的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多