2015-11-24 3 views
1

Я пытаюсь вычислить разницу между 2 значениями даты и времени, когда нерабочие часы игнорируются. Первоначально он просто посмотрел на разницу и подсчитал ее как минуты, но нужно считать только часы между 9 утра и 8 вечера с понедельника по пятницу и с 9 утра до 1 вечера в субботу, игнорируя все остальные времена. Я нахожусь в системе оракула 10g.Вычислить разницу во времени без учета нерабочих часов

мой код, как это в настоящее время стоит следующим образом:

begin 

debug.debug('sp_access'); 

update cl_case b 
    set time_to_sp_access = 
    (
    select (x.date_created-e.date_created)*1440 
    from cl_case c, eventlog e, eventlog x 
    where c.id=e.case_id 
    and x.case_id=e.case_id 
    and b.id=e.case_id 
    and e.id= 
       ( select min(id) from eventlog mini 
         where mini.case_id=e.case_id 
         and mini.cl_code in ('AAAA','BBBB','CCCC','DDDD') 
       ) 
    and x.id= 
       ( select min(id) from eventlog minix 
         where minix.case_id=e.case_id 
         and minix.cl_code in ('EEEE','FFF','GGG','HHHH','JJJJ','KKKK','LLLL') 
       ) 
    ) 
where id in 
    ( select unique case_id 
     from eventlog elog 
     where elog.sptime_needs_setting ='Y' 
    ); 

    commit; 

end sp_access; 

Как я могу получить это рассчитывать время между указанными часов?

благодарит

+0

Что относительно праздничных дней? –

ответ

1

Вы можете использовать выражение в CASE, в разделе о WHERE. Так как есть два значения datetime, вам нужно использовать два выражения case.

Например, выражениеПРИМЕР будет оценивать как:

SQL> SELECT 
    2 CASE 
    3  WHEN TO_CHAR(SYSDATE, 'DY') BETWEEN '1' AND '5' 
    4  THEN TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY') 
    5  ||' 08:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM') 
    6  ELSE TO_DATE(TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY') 
    7  ||' 01:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM') 
    8 END my_time 
    9 FROM dual; 

MY_TIME 
---------------------- 
11/24/2015 01:00:00 pm 

Приведенный выше пример проверки ДЕНЬ для SYSDATE, и в зависимости от него возвращает значение даты и времени.

используя приведенный выше пример, поскольку у вас есть два различных значения даты-времени можно сравнить как условие диапазона дат, то вам нужно два СЛУЧАЯ выражение в вашем ИНЕК.

WHERE date_column 
BETWEEN 
    CASE 
     WHEN TO_CHAR(date_column, 'DY') BETWEEN '1' AND '5' 
     THEN 
     TO_DATE(TO_CHAR(
       TRUNC(date_column), 'MM/DD/YYYY') 
        ||' 09:00:00 AM', 'MM/DD/YYYY HH:MI:SS PM') 
     ELSE 
     TO_DATE(TO_CHAR(
       TRUNC(date_column), 'MM/DD/YYYY') 
        ||' 09:00:00 AM', 'MM/DD/YYYY HH:MI:SS PM') 
    END 
AND 
    CASE 
     WHEN TO_CHAR(date_column, 'DY') BETWEEN '1' AND '5' 
     THEN 
     TO_DATE(TO_CHAR(
       TRUNC(date_column), 'MM/DD/YYYY') 
        ||' 08:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM') 
     ELSE 
     TO_DATE(TO_CHAR(
       TRUNC(date_column), 'MM/DD/YYYY') 
        ||' 01:00:00 PM', 'MM/DD/YYYY HH:MI:SS PM') 
    END 
+0

, где это должно быть добавлено в моем исходном коде? Это первое, где говорится? Также я что-то не понимаю, кажется, что если день между Пн и Пт, он устанавливает время начала до 9 утра без проверки фактического времени. Если днем ​​будет e..g вторник, то он должен проверить, что время после 9 утра, если он через 9 часов использует фактическое время, если он находится до 9 часов, тогда он должен использовать 9 утра в качестве времени начала. – HardLeeWorking

+0

@HardLeeWorking Пришли усилия, чтобы опубликовать рабочий пример и образец, основанный на информации в вопросе. Я был бы признателен, если бы вы предоставили инструкции create и insert для выборочных данных и показали желаемый результат. Измените свой вопрос и добавьте эти данные. –

+0

@HardLeeWorking Кроме того, см. [Stack Overflow tour] (http://stackoverflow.com/tour), чтобы понять, как работает этот сайт. Если вы найдете ответ полезным, подтвердите его, если он ответит на ваш запрос, примите его. –

Смежные вопросы