【问题标题】:SQL Query to check if the start date and end date columns are within the parameter dateSQL查询检查开始日期和结束日期列是否在参数日期范围内
【发布时间】:2022-01-13 19:41:49
【问题描述】:

我有一个查询如何处理参数日期范围内的日期

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 - 2021 年 11 月 10 日 p_to_date 2021 年 11 月 28 日

  1. person_id #10 行不应出现,因为开始日期和结束日期不在此范围内。
  2. person_id #01 行应该出现在输出中。开始日期在 p_from_Date 之后,但结束日期在 p_tp_Date 之后
  3. person_id #03 行应该来了。虽然开始日期早于 p_from_date 但离开日期在此日期范围内。
  4. person_id #04 行应该是开始日期在日期范围之间。
  5. 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

【问题讨论】:

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

几个BETWEENs 应该可以很好地处理第一部分,而 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

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

【讨论】:

  • 成功了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2019-07-11
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多