簡體   English   中英

合並來自單獨表的日期字段

[英]Combining dates fields from separate tables

我有兩個幾乎完全相同的表。 唯一的區別是一個存檔表(稱為B)已將任何記錄從另一表中刪除(稱為A)。

我需要從給定的數據范圍中獲取所有記錄,因此我需要將兩個表聯接起來(實際上將它們聯接到第三個表以獲取不在這些表上的一條信息,但這不會影響我的問題)。

我想按記錄來自的小時分組(即trunc(<date_field>, 'hh')

但是,由於我需要從兩個表中每小時獲取記錄,因此似乎需要生成一個單一的日期字段進行分組,否則分組就沒有意義了。 每條記錄僅具有來自一個字段的日期,因此,如果我按任何一個表的日期字段進行分組,則本來會從另一個表中省略記錄,並且如果我按這兩個表進行分組,我將得不到數據,因為兩個表中都沒有記錄。

因此,我想做的是添加兩個“日期”,並使其像在Excel中一樣工作(即,將日期視為等效的數字,將其相加,然后返回結果日期,至少是這樣)在一種情況下,添加日期是有效的, 盡管此線程另有意見

這將更有意義,因為我將用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)提供有關如何使添加項起作用的任何建議,否則,將為組合這三個表提供一種替代途徑,以使我能夠按開始日期值進行分組

與往常一樣,我們非常感謝您的幫助。

添加日期或將日期強制轉換為數字會拋出ORA-00975: date+date not allowed以及ORA-01722: invalid number 那么,如何在Excel中對日期進行操作呢? 我的想法是從日歷中to_date(1, J)您要處理的每個日期的第一天到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                                        

@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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM