2015-12-07 4 views
1

У меня есть таблица заказов, которые имеют create_date_time (то есть - 02/12/2015 14:00:44)Oracle 9i Group офсетным время даты

То, что я хотел бы сделать, это группа два месяца стоит заказы этого create_date_time, но вместо того, чтобы использовать trunc и использовать подходящий день, я хотел бы перейти с 6 утра до 6 утра. Я пробовал это ниже, но похоже, что он не работает таким образом, скорее он обрезает, а затем изменяет create_date_time.

select "Date", sum(CFS), sum(MCR) from 
(select trunc(phi.create_date_Time)+6/24 as "Date", 
     case when pkt_sfx = 'CFS' then sum(total_nbr_of_units) 
     End as CFS, 
     case when pkt_sfx <> 'CFS' then sum(total_nbr_of_units) 
     end as MCR 
from pkt_hdr ph 
    inner join pkt_hdr_intrnl phi 
    on phi.pkt_ctrl_nbr = ph.pkt_ctrl_nbr 
where sale_grp = 'I' 
group by trunc(phi.create_date_time)+6/24, pkt_sfx 
union 
select trunc(phi.create_date_Time)+6/24 as "Date", 
     case when pkt_sfx = 'CFS' then sum(total_nbr_of_units) 
     End as CFS, 
     case when pkt_sfx <> 'CFS' then sum(total_nbr_of_units) 
     end as MCR 
from wm_archive.pkt_hdr ph 
    inner join wm_archive.pkt_hdr_intrnl PHI 
    on phi.pkt_Ctrl_nbr = ph.pkt_ctrl_nbr 
where sale_grp = 'I' 
    and trunc(phi.create_date_time) >= trunc(sysdate)-60 
group by trunc(phi.create_date_time)+6/24, pkt_sfx 
) 
group by "Date" 

Пожалуйста, обратите внимание, что объединение не обязательно важно, но это требуется в коде, как половина результаты будут заархивированы, но текущий архив день приведет к дате перекрытия, которые должны быть удалены с внешнего запроса.

Благодаря

ответ

1

Просто поменять порядок TRUNC и добавление 6h - вместо

select trunc(phi.create_date_Time)+6/24 as "Date" 

использования

select trunc(phi.create_date_Time + 6/24) as "Date" 

(также необходимо изменить другие вхождения trunc())

BTW: Я бы использовал другое имя для "D ate "- DATE - это тип данных SQL, поэтому наличие столбца с именем« Дата »несколько сбивает с толку.

+0

Я понимаю, что вы имеете в виду, и это имеет значение, но бит, с которым я борюсь, заключается в том, что я пытаюсь найти данные с 6 утра до 6 утра в субботу и группировать это как один день, затем 6 утра в субботу до 6 утра в воскресенье и группу, которая как один день. Мой код и ваш изменяет дату, но не помогают мне правильно группировать данные. – LuckySevens

+0

Если вы меняете каждое событие trunc() соответственно, оно должно работать. Если нет, отредактируйте свой вопрос и добавьте пример ввода, ожидаемый вывод и фактический вывод. –

1

Если я правильно понял, вы должны вычесть шесть часов с даты, а затем Trunc эту дату:

select trunc(dt-6/24) dt, sum(units) u 
    from (select dt, units from t1 union all 
     select dt, units from t2) 
    group by trunc(dt-6/24) 

Тест:

create table t1 (dt date, units number(5)); 
insert into t1 values (timestamp '2015-12-01 12:47:00', 7); 
insert into t1 values (timestamp '2015-12-01 23:47:00', 7); 

create table t2 (dt date, units number(5)); 
insert into t2 values (timestamp '2015-12-02 05:47:00', 7); 
insert into t2 values (timestamp '2015-12-02 14:47:00', 7); 

Выход:

Dt   U 
---------- --- 
2015-12-01 21 
2015-12-02 7 
Смежные вопросы