最近在入庫一大批數據,入了20多張表整整一天半時間,可謂是臉都僵了,然而就在處理日期型和時間型數據,通過自己的摸索,get到了一些套路,還是很開心的,趁請假還是好好總結一下吧!
鑒于日期型數據DATE通常是用YYYY-MM-DD的格式進行存儲查詢,而時間型數據TIME在網上我也沒看到太多參考,但是注意到數據庫是有TIME這個類型數據的,格式是HH:MM:SS,因此向著這兩個格式去對數據進行整理。
一般我們接到的日期時間型數據完整的文本是長這樣的:
2016/11/1 12:00:00 or 2016-11-01 12:00:00? or 2016/11/1 12:00
文本源數據通常將日期和時間都默認在一個字段?。而我的想法是:為了減輕后期數據查詢的難度,將日期時間型數據都整理為對應的日期時間型,即DATE和TIME,這樣后期就不用其他的cast等函數進行查詢。
因此處理的步驟為: 1、分割字段
在UE編輯器中將日期時間型數據進行分割,如?2016/11/1 12:00:00分割成2016/11/1|12:00:00,其中|為分割符;
2、編輯數據入庫?腳本
如果源數據的日期本來就是對應的'?YYYY-MM-DD'如: 2016-11-01(嚴格符合,否則出錯,2016-11-1也是不符合的)那么入庫的時候就可以直接指定字段類型:
日期字段名稱 DATE FORMAT(‘YYYY-MM-DD’)?
那么分割后的時間字段同理,如果本來的格式就是HH:MM:SS,那么直接指定字段類型:
時間字段名稱 TIME
如果源數據不是這種類型的格式,像?2016/11/1、2016/11/01這種,那么入庫的時候直接用varchar類型入庫就好,后期再處理。
3、格式處理
入庫了以后,如果格式本來就是對應那兩種,那很好,收工檢查數據看看有沒有亂碼和重復數據就好;如果不是那兩種,那就要進行數據處理了。 一般入庫我會用一個temp作為表名,因為數據格式都比較純天然。入庫以后再建一個新表插入temp表的數據,插入的同時也對數據進行處理。 處理的過程:
先用其他函數對數據進行處理,整理成對應的格式,最后用cast函數?對字段進行類型轉換。
使用的函數:
casewhen +substring/index/length/||?
這些函數自由組合,發揮自己的想象力即可。 簡單的來說就是使用 substring / index / length /函數對數據進行識別,用case when 和 || 處理數據,拼接成自己想要的樣子,不過要注意同樣的一列數據可能存在不同的情況,因此要借用case when來處理,不確定的話可以select一下試試先。 具體的函數功能看看Teradata SQL文檔即可,這里不詳細介紹了。 以下是幾個例子: 4、字段類型轉換
通過以上步驟,基本上可以將數據處理成對應的格式,在外層再加一個select的語句進行最后的轉換即可。
例如:
select cast(字段A? as DATE FORMAT 'YYYY-MM-DD') as date_name, cast(字段B as TIME) as time_namefrom (select ? case when length....else....end as 字段A ,case when length....else....end as 字段B from temp )? a ;5、檢查
將入庫的字段進行查詢檢查,看是否處理不當或者存在編碼問題,檢查數據量是否一致等等。?
新聞熱點
疑難解答