2013-03-06 59 views
0

客戶端站點爲我們加載了以下提取文件以加載到我們的數據庫中。Oracle SQL加載器 - 在同一列中加載不一致的日期格式

問題是,對於某些行(例如第二行),CREATE_DATE和LAST_UPDATE_DATE以「dd Mmm YYYY ...」日期格式表示,其餘行(如頂部)格式爲「YYYY-MM-DD HH24.MI.SSXFF」 的

PRIMARY_ID ID VALUE  CREATED_DATE   LAST_UPDATE_DATE 
20166267 20834830491 2012-04-30 08:18:00 2012-04-30 08:18:00 
20166536 9112   01 Oct 2010 17:27:04 01 Oct 2010 17:27:04 

我的問題是: Q1。爲避免必須請求提取,我們可以使用.ctl腳本在SQL Loader中的導入時間處理這些「dd Mmm YYYY ...」格式化的日期嗎?目前我.CTL是

我.CTL文件腳本使用導入:

IDENTIFIER_START_DATE TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF", 
LAST_UPDATE_DATE  TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF" 

Q2。只是要求他們按照要求重新提取所有日期格式,並在這種情況下采取最佳做法?

+2

您可以加載到臨時表中作爲varchar列並從那裏轉換(或使用外部表)。不知道你可以在.ctl內做很多事情。我會關注其他專欄中不太明顯的問題,甚至 - 儘管這似乎不是樣本問題 - mm/dd和dd/mm之間的混淆,這可能會導致微妙的腐敗或失敗。我不認爲期待理智的數據是不合理的。理性並不總是會出現在它當中...... – 2013-03-07 00:02:18

回答

2

是否要求重新提取數據取決於許多因素。

  • 這是一次性過程還是正在進行的數據饋送?嘗試儘量利用一次性數據加載數據來更好地檢測異常值可能是非常合理的。如果您要管理正在進行的數據饋送,通常會對文件達到嚴格標準達成一致意見,而不是嘗試手動檢查有問題的行。
  • 客戶是否有動力使您的裝載過程簡單且可重複?還是客戶以固定價格出售,以任何他們想提供的格式加載數據?如果客戶有促使加載過程簡單且可重複的動機,那麼他們有必要投入時間來生成乾淨的文件。如果您爲了將文件轉化爲一致的數據而需要做的工作以固定的價格出售給他們,另一方面,如果您將大量工作重新投入他們,他們可能不會感到滿意。
  • 是否有行數據不明確?例如「01-02-03」可以指2003年1月2日或1903年1月2日或2001年2月3日或其他日期。如果有歧義,請求重新提取是有意義的。

至於如何加載數據,雖然可以在一個步驟中完成,但您通常不會想要。將數據加載到登臺表(或使用外部表)中通常會更有意義,其中所有列都聲明爲VARCHAR2,然後編寫一些ETL邏輯,將數據轉換爲適當的數據類型(並記錄無法轉換的數據)。例如,如果你將數據加載到所有的列被定義爲VARCHAR2一個臨時表,你可以使用類似的my_to_date function in this thread嘗試了許多不同的格式遮光罩,找到一個工作(如果有很多可能的面具,您可能需要遍歷一個集合,而不是按照我在該示例中那樣對兩個蒙版進行硬編碼)。

還有一點......一個Oracle DATE會將時間存儲到第二個秒鐘,這看起來就像是您給出的數據的精度。因此,將數據加載到DATE列而非TIMESTAMP列似乎更有意義。

1

使用此。ctl腳本:

load data 
append 
into table schema_name.table_name 
fields terminated by ';' optionally enclosed by '"' 
(
PRIMARY_ID, 
ID_VALUE, 
CREATED_DATE "to_date(:CREATED_DATE, case when regexp_substr(:CREATED_DATE,'\w+',1,2)=regexp_substr(:CREATED_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)", 
LAST_UPDATE_DATE "to_date(:LAST_UPDATE_DATE, case when regexp_substr(:LAST_UPDATE_DATE,'\w+',1,2)=regexp_substr(:LAST_UPDATE_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)" 
)