代码之家  ›  专栏  ›  技术社区  ›  John

同期内招聘的员工

  •  -1
  • John  · 技术社区  · 4 年前

    当我试图查看两名员工是否在同一时间段内工作时,我的查询逻辑遇到了一个奇怪的困难。

    我有一个员工表,其中包含员工id(emp_id)以及他们的(start_Date)和(end_Date),这两种日期类型都存储为“yyyy-mm-dd”。

    我的问题是(E1开始于2006-08-27,结束于2009-05-14,E2开始于2007-01-13,结束于2008-06-25,换句话说,它们在同一时间段内工作):

    SELECT *
    FROM employees e1, employees e2
    WHERE e1.emp_ID = '1' AND e2.emp_ID = '2'
    AND e1.start_Date <= e2.start_Date AND e1.end_Date >= e2.end_Date;
    

    如果我翻转两个员工ID,它不会返回任何东西吗?我的逻辑中缺少了一些东西,但我很难找到。谢谢你的时间和帮助。

    1 回复  |  直到 4 年前
        1
  •  0
  •   GMB    4 年前

    如果我没理解错的话,你只需要修正逻辑,正确检查雇佣期是否重叠:

    select e1.emp_id emp_id_1, e2.emp_id emp_id_2
    from employees e1
    inner join employees e2
        on e1.start_date <= e2.end_date and e1.end_date >= e2.start_date
    where e1.emp_id = 1 and e2.emp_id = 2
    

    笔记:

    • 使用标准的显式连接(与 on 关键字)而不是老派的隐式连接(在 from 条款)

    • 看起来像 emp_id 是一个数字,因此应将其视为数字(文字值周围没有单引号)

    • select * 这里不是一个好的选择:这是一个自连接,所以列名在结果集中是模糊的;请枚举并别名中的列 select 条款