SQL 查询以检查开始日期和结束日期列是否在参数日期内

SQL Query to check if the start date and end date columns are within the parameter date

我想查询如何处理参数日期范围内的日期

select absence_name,
abs_start_date,
abs_end_date,
PERSON_ID
from abs_table JOIN PER_ALL_PEOPLE_F PAPF
on (papf.person_id = abs_table.person_id)

输出看起来像 -

ABSENCE_NAME        abs_start_date      abs_end_date    PERSON_ID
Vacation            01-JAN-2021         03-FEB-2021     10
VACATION            24-NOV-2021         30-NOV-2021     01
Maternity           10-OCT-2021         25-OCT-2022     03
Paid Leave          27-NOV-2021         28-NOV-2021     04
VACATION            01-JUN-2021         19-NOV-2021     05
Maternity           01-NOV-2021         19-NOV-2022     06
Maternity           27-NOV-2021         19-DEC-2021     07

现在我想在输出 wrt 中解决三个条件。日期。参数日期为 p_From_Date - 10-Nov-2021 p_to_date 28-Nov-2021

  1. person_id #10 行不应该出现,因为开始日期和结束日期不在此范围内。
  2. person_id #01 行应该出现在输出中。开始日期在 p_from_Date 之后,尽管结束日期在 p_tp_Date
  3. 之后
  4. person_id#03行应该来了。虽然开始日期早于 p_from_date 但离开日期在此日期范围内。
  5. person_id #04 行应该出现,因为开始日期在日期范围内。
  6. person_id#05也该来了

我如何处理上面的查询,如果这个人的开始日期和结束日期在日期范围内,而不管它只是开始日期还是结束日期 该行应返回。

此外,同一问题的第二部分,如果缺勤是产假,并且如果此人在开始日期和结束日期的整个范围内都在休产假,则应在输出中传递标志 Y。 否则为空

ABSENCE_NAME    abs_start_date      abs_end_date    PERSON_ID     Rule_flag
Vacation        01-JAN-2021         03-FEB-2021     10
VACATION        24-NOV-2021         30-NOV-2021     01
Maternity       10-OCT-2021         25-OCT-2022     03              Y
Paid Leave      27-NOV-2021         28-NOV-2021     04
VACATION        01-JUN-2021         19-NOV-2021     05
Maternity       01-NOV-2021         19-NOV-2022     06              y
Maternity       27-NOV-2021         19-DEC-2021     07

因此,例如,员工 #3,06 在参数传递的整个期间都在休产假,则标志为 Y

员工 #07 正在休产假,但在 p_from 日期后的几天,因此它不会是 Y。我们如何在上面的同一个查询中为此添加检查 a

几个 BETWEEN 应该可以很好地处理第一部分,而 CASE 表达式可以处理规​​则:

WITH rangeData
  AS (SELECT DATE '2021-11-10' AS P_FROM_DATE,
             DATE '2021-11-28' AS P_TO_DATE
        FROM DUAL)
select absence_name,
       abs_start_date,
       abs_end_date,
       PERSON_ID,
       CASE
         WHEN UPPER(ABSENCE_NAME) = 'MATERNITY' AND
              ABS_START_DATE <= P_FROM_DATE AND
              ABS_END_DATE   >= P_TO_DATE
           THEN 'Y'
           ELSE NULL
       END AS RULE_FLAG
  from abs_table
  INNER JOIN PER_ALL_PEOPLE_F PAPF
    on papf.person_id = abs_table.person_id
  CROSS JOIN rangeData
  WHERE ABS_START_DATE BETWEEN P_FROM_DATE AND P_TO_DATE OR
        ABS_END_DATE   BETWEEN P_FROM_DATE AND P_TO_DATE

未在动物身上进行测试 - 您将是第一个!