首页 > 解决方案 > 如何减去“Sysdate”的日期范围

问题描述

我有一个称为“昨天的任务”的查询,并检查今天是否是星期一。如果是星期一,它会给我上周五的任务,如果不是,前一天的任务。由于我们也开始在周末工作,如果是星期一,我希望它会给我星期五、星期六和星期日的任务。这是我当前的代码:

select
to_char(sysdate -0.25,'DAY') day,
t.task_id,
NVL (pu.part_id, 'NONE') part_id,
t.request_id,
(select(concat(concat (p.first_name, ' '), p.last_name)) from person p where t.person_id = p.person_id) name,
pu.quantity,
to_number(pu.user_def15, '9999999.99') lunch,
to_char(cast(t.actual_start_dttm as timestamp) at time zone 'US/Eastern', 'HH24:MI') started,
to_char(cast(t.actual_end_dttm as timestamp) at time zone 'US/Eastern', 'HH24:MI') ended,
NVL(pu.user_def2, 'MISSING') description,
case when NVL(pu.user_def2, 'MISSING') = 'MISSING' then '#FF0000' else '#000000' end description_c,
t.task_status,
to_char(t.plan_start_dttm, 'YYYY-MM-DD') start_date,
to_char (sysdate-0.25,'DD-MM-YYYY HH24:MI') today
from task t 
LEFT JOIN part_usage pu ON t.task_id = pu.task_id
where t.access_group = 'CAPCA'
and NVL(pu.part_id, 'NONE') IN ('030X001', '030A01','NONE')
and to_char(t.plan_start_dttm, 'YYYY-MM-DD') =
CASE WHEN
to_char(sysdate - 0.25,'DAY') = 'MÅNDAG '
THEN
 to_char (sysdate-3.25, 'YYYY-MM-DD')
ELSE
 to_char (sysdate-1.25, 'YYYY-MM-DD')
END
order by name

所以我想将“THEN”修改为 sysdate-3.25、2.25 和 1.25。

谢谢

标签: sqloracle

解决方案


我建议使用CASE .. WHEN如下:

替换查询的这一部分:

and to_char(t.plan_start_dttm, 'YYYY-MM-DD') =
CASE WHEN
to_char(sysdate - 0.25,'DAY') = 'MÅNDAG '
THEN
 to_char (sysdate-3.25, 'YYYY-MM-DD')
ELSE
 to_char (sysdate-1.25, 'YYYY-MM-DD')
END

具有以下内容:

CASE
    WHEN TO_CHAR(SYSDATE - 0.25, 'DAY') = 'MÅNDAG ' THEN 
        CASE
            WHEN TRUNC(T.PLAN_START_DTTM) BETWEEN TRUNC(SYSDATE - 3.25) AND TRUNC(SYSDATE - 0.25) THEN 1
        END
    ELSE 
        CASE
            WHEN TRUNC(T.PLAN_START_DTTM) = TRUNC(SYSDATE - 0.25) THEN 1
        END
END = 1

干杯!!


推荐阅读