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
- person_id #10 行不应该出现,因为开始日期和结束日期不在此范围内。
- person_id #01 行应该出现在输出中。开始日期在 p_from_Date 之后,尽管结束日期在 p_tp_Date
之后
- person_id#03行应该来了。虽然开始日期早于 p_from_date 但离开日期在此日期范围内。
- person_id #04 行应该出现,因为开始日期在日期范围内。
- 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
未在动物身上进行测试 - 您将是第一个!
我想查询如何处理参数日期范围内的日期
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
- person_id #10 行不应该出现,因为开始日期和结束日期不在此范围内。
- person_id #01 行应该出现在输出中。开始日期在 p_from_Date 之后,尽管结束日期在 p_tp_Date 之后
- person_id#03行应该来了。虽然开始日期早于 p_from_date 但离开日期在此日期范围内。
- person_id #04 行应该出现,因为开始日期在日期范围内。
- 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
未在动物身上进行测试 - 您将是第一个!