2015-03-24 3 views
0

У меня есть две таблицы, которые почти точно такие же. Единственное различие заключается в том, что одна из них - это таблица архива (вызов B), в которой есть записи, удаленные из другой таблицы (вызов A)Объединение полей дат из отдельных таблиц

Мне нужно получить ВСЕ записи из заданного диапазона данных, поэтому мне нужно присоединитесь к двум таблицам (и фактически присоедините их к третьему, чтобы получить часть информации, которая не находится в этих таблицах, но это не влияет на мою проблему).

Я хотел группе час запись происходит от (т.е. trunc(<date_field>, 'hh')

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

Итак, я хочу добавить две «даты» и заставить ее работать так, как в Excel (т.е. даты будут рассматриваться как их числовой эквивалент, get добавленной , и возвращается итоговая дата, которая, кстати, является по крайней мере одним случаем, когда добавление дат действительно, despite this thread's opinion otherwise)

Это имеет еще больший смысл, поскольку я буду заменять нулевое значение даты на 0, поэтому он должен функционировать как добавление числа к дате (12/31/14 + 1 = 1/1/15).

Я просто не смог заставить его работать. Я пытался несколько итераций, чтобы получить расчет для работы последних из которых:

SELECT DISTINCT Avg(NVL(to_number(to_char(trunc(fcr.actual_start_date, 'hh')))*86400, 0) + NVL(to_Number(to_char(trunc(acr.actual_start_date, 'hh')))*86400, 0)) Start_Num, SUM(AA.SESSIONCPU) TotalCPU, Count(1) Cnt 
, SUM((NVL(to_number(to_char(trunc(fcr.actual_completion_date, 'hh')))*86400, 0) + NVL(to_Number(to_char(trunc(acr.actual_completion_date, 'hh')))*86400, 0) 
- NVL(to_number(to_char(trunc(fcr.actual_start_date, 'hh')))*86400, 0) - NVL(to_Number(to_char(trunc(acr.actual_start_date, 'hh')))*86400, 0))) TotRun 

FROM PSTAT.A$_A AA 
    LEFT OUTER JOIN APPL.FND_CR FCR On FCR.O_SES_ID = AA.SEsID 
    LEFT OUTER Join XX.E_FND_CR ACR on ACR.O_SES_ID = aa.sesid 
WHERE (trunc(fcr.actual_start_date) >= to_date('28-Dec-2014', 'DD-MON-YYYY') 
    Or trunc(acr.actual_start_date) >= to_date('28-Dec-2014', 'DD-MON-YYYY')) 
    AND rownum <= 1048500 
    and (acr.status_code = 'C' or fcr.status_Code = 'C') 
    AND aa.sessioncpu is not null 
GROUP BY to_number(NVL(trunc(fcr.actual_start_date, 'hh'), 0))*86400 + to_Number(NVL(trunc(acr.actual_start_date, 0), 'hh'))*86400 
ORDER BY 2, 1; 

Моя явная проблема с выше кодой является то, что жаба продолжает игнорировать слепки и говорит, что он ожидает значение даты, когда он получает номер (подсвечивается 0). Так что если кто-то мог:

А) Подскажите, почему жаба будет игнорировать слепки (он должен видеть номер и поэтому не должны иметь абсолютно никакого ожидания даты)

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

Как всегда, любая помощь очень ценится.

+0

Nitpicking: это не «TOAD», который ожидает чего-либо или дает ошибку. Это база данных Oracle. Любой другой клиент SQL даст вам ту же ошибку. Btw: 'to_number (to_char (trunc (fcr.actual_start_date, 'hh')))' можно сократить до: 'extract (hour from fcr.actual_start_date) ' –

+1

' Мне нужно получить ВСЕ записи из заданного диапазона данных, поэтому мне нужно присоединиться к двум таблицам' - вам не нужно присоединяться к ним. Они не пересекаются, поэтому вы можете использовать 'UNION ALL'. –

ответ

0

@David, ваше предложение, кажется, работал как шарм. Для тех, кто приходит после этого, мой код обновляется следующим образом:

SELECT trunc(cr.actual_start_date, 'hh') Start_Date, SUM(AA.SESSIONCPU) TotalCPU, 
    Count(1) Cnt, SUM((cr.Actual_Completion_Date - cr.Actual_Start_Date)*86400) TotalRun 
FROM (SELECT Actual_Start_Date, Actual_Completion_Date, Oracle_Session_ID, Status_Code 
     FROM APPL.FND_CR 
    UNION ALL 
    SELECT Actual_Start_Date, Actual_Completion_Date, Oracle_Session_ID, Status_Code 
     FROM XX.E_FND_CR) cr 
RIGHT OUTER JOIN PSTAT.A$_A AA ON cr.Oracle_Session_ID = AA.SessionID 
WHERE trunc(cr.actual_start_date) >= to_date('28-Dec-2014', 'DD-MON-YYYY') 
AND rownum <= 1048500 
and cr.status_code = 'C' 
GROUP BY trunc(cr.actual_start_date, 'hh') 
ORDER BY 1; 
0

Добавление дат или их литье к номерам бросков ORA-00975: date+date not allowed и ORA-01722: invalid number. Итак, что можно сделать здесь, чтобы оперировать датами в Excel способ? Моя идея состоит в том, чтобы вычесть первый день из календаря to_date(1, J) с каждой даты, с которой вы хотите работать.

Пример с контрольными датами:

with test_data as (
    select sysdate dt from dual union all 
    select to_date(1, 'J') from dual union all 
    select null from dual) 
select nvl(trunc(dt, 'hh') - to_date(1, 'J'), 0) num_val, dt, 
    to_char(dt, 'J') tc1, to_char(dt, 'yyyy-mm-ss hh24:mi:ss') tc2 
    from test_data 

    NUM_VAL DT   TC1  TC2    
---------- ---------- ------- ------------------- 
2457105,96 2015-03-24 2457106 2015-03-14 23:12:14 
     0 4712-01-01 0000001 4712-01-00 00:00:00 
     0           
+0

Попытка убедиться, что я следую. Чтобы реализовать ваше предложение, я бы использовал 'nvl (trunc (dt, 'hh') - to_date (1, 'J'), 0)' в полях даты и выполнить соответствующую арифметику, чтобы получить каждое из значений, которые я пытаюсь вывести? ех. 'Start_Num' будет' nvl (trunc (fcr.actual_start_date, 'hh') - to_date (1, 'J'), 0) + nvl (trunc (acr.actual_start_date, 'hh') - to_date (1, 'J '), 0)' ' – JMichael

+0

Да. Но в вашем случае объединение данных сначала решает проблему, поэтому нет необходимости в датах _add_. –

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