组合来自单独表的日期字段

时间:2015-03-24 20:06:25

标签: sql oracle outer-join toad

我有两张几乎完全一样的桌子。唯一的区别是一个是从另一个表中删除任何记录的归档表(称为B)(称为A)

我需要从给定的数据范围中获取所有记录,因此我需要加入这两个表(实际上将它们连接到第三个表以获取一些不在这些表上的信息,但这不会影响我的问题。)

我想按记录来自的小时分组(即trunc(<date_field>, 'hh')

但是,由于我需要从两个表中获取每小时的记录,我似乎需要生成一个单独的日期字段进行分组,否则该组将没有意义;每个记录只有一个字段的日期,所以如果我按表格的日期字段分组,它会固有地忽略另一个字段的记录,如果我按两个字段分组,我将没有数据返回没有记录出现在两个表格中。

所以,我想要做的是添加两个&#34;日期&#34;并使它像在Excel中一样工作(即将日期视为等效数字,添加,并返回结果日期,顺便说一下,至少有一种情况是添加日期有效,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;

我对上面代码的明确问题是Toad一直忽略了强制转换,并且说当它得到一个数字时会期望一个日期值(0突出显示)。所以如果有人可以:

A)告诉我为什么Toad会忽略演员表(应该看到一个数字,因此绝对没有期待约会)

B)提供有关如何使添加工作的任何建议,或者未提出建议组合三个表的替代路线,以便我能够按开始日期值进行分组

与往常一样,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

添加日期或将其投射到数字ORA-00975: date+date not allowedORA-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                                        

答案 1 :(得分: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;