如何减去“ Sysdate”的日期范围

时间:2019-11-18 14:44:47

标签: sql oracle

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

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。

谢谢

2 个答案:

答案 0 :(得分:0)

我想你想要

( (to_char(sysdate - 0.25, 'DAY') = 'MÅNDAG ' and
   t.plan_start_dttm >= trunc(sysdate - 3.25) and
   t.plan_start_dttm < trunc(sysdate - 0.25)
  ) or
  (t.plan_start_dttm >= trunc(sysdate - 1.25) and
   t.plan_start_dttm < trunc(sysdate - 0.25)
  )
)

我不确定为什么要将日期转换为字符串以进行比较。那是个坏习惯。 Oracle通常具有足够的日期/时间功能来支持这种比较。

答案 1 :(得分:0)

我建议如下使用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

干杯!