Join two tables date from first in range of dates

2020-04-08 14:53发布

I have two tables like below (date format: yyyy-MM-dd):
1) Table1 - EMPLOYEE_OVERTIMES (alias: EO)

EMPLOYEE_ID | OVERTIME_DATE
------------------------------------------------
1           | 2012-04-01
2           | 2012-08-14
3           | 2012-07-22
4           | 2012-10-30
5           | 2012-06-07

2) Table2 - EMPLOYEE_HOLIDAYS (alias: EH)

EMPLOYEE_ID | START_DATE | END_DATE   |
-----------------------------------------
1           | 2012-03-28 | 2012-04-10
2           | 2012-01-14 | 2012-01-30
3           | 2012-07-15 | 2012-07-25
4           | 2012-10-10 | 2012-10-13
5           | 2012-06-01 | 2012-06-07

The tables EMPLOYEE_OVERTIMES and EMPLOYEE_HOLIDAYS are joined from other tables. I would like to find all records that meet folowing criteria: EH.START_DATE <= EO.OVERTIME_DATE <= EH.END_DATE

3) Result table

EMPLOYEE_ID | START_DATE | END_DATE   | OVERTIME_DATE
-------------------------------------------------------
1           | 2012-03-28 | 2012-04-10 | 2012-04-01
3           | 2012-07-15 | 2012-07-25 | 2012-07-22
5           | 2012-06-01 | 2012-06-07 | 2012-06-07

3条回答
Emotional °昔
2楼-- · 2020-04-08 15:10

You can use simple INNER JOIN

;WITH EO AS 
(
    SELECT 1 AS EID, '2012-04-01' AS OD
    UNION ALL
    SELECT 2, '2012-08-14'
    UNION ALL
    SELECT 3, '2012-07-22'
    UNION ALL
    SELECT 4, '2012-10-30'
    UNION ALL
    SELECT 5, '2012-06-07'
), EH AS
(
    SELECT 1 AS EID, '2012-03-28' AS SD, '2012-04-10' AS ED
    UNION ALL
    SELECT 2, '2012-01-14', '2012-01-30'
    UNION ALL
    SELECT 3, '2012-07-15', '2012-07-25'
    UNION ALL
    SELECT 4, '2012-10-10', '2012-10-13'
    UNION ALL
    SELECT 5, '2012-06-01', '2012-06-07'
)

SELECT EH.EID, EH.SD, EH.ED, EO.OD 
FROM EO
INNER JOIN EH
    ON EH.SD <= EO.OD AND EO.OD <= EH.ED
查看更多
够拽才男人
3楼-- · 2020-04-08 15:11

Would this work?

SELECT
  EO.Employee_ID,
  EH.Start_Date,
  EH.End_Date,
  EO.OverTime_Date
FROM
  EMPLOYEE_OVERTIMES EO INNER JOIN
  EMPLOYEE_HOLIDAYS EH ON EO.Employee_ID = EH.Employee_ID
WHERE
  EO.Overtime_Date BETWEEN EH.Start_date and EH.End_Date
查看更多
闹够了就滚
4楼-- · 2020-04-08 15:14

SQLFiddle demo

SELECT EH.*, EO.OVERTIME_DATE 
FROM EMPLOYEE_HOLIDAYS EH
JOIN EMPLOYEE_OVERTIMES EO
ON (EO.EMPLOYEE_ID = EH.EMPLOYEE_ID) AND 
   (EO.OVERTIME_DATE BETWEEN EH.START_DATE AND EH.END_DATE)
查看更多
登录 后发表回答