增量抽取-時間戳方式實現


----------時間戳方式抽取數據------------------------
介紹:它是一種基於快照比較的變化數據捕獲方式,在源表上增加一個時間戳字段,系統中更新修改表數據的時候,同時修改時間戳字段的值。當進行數據抽取時,通過比較上次
         抽取時間與時間戳字段的值來決定抽取那些數據。有的數據庫的時間戳支持自動更新,即表的其他字段的數據發生變化時,自動更新時間戳字段。有的數據庫不支持時間戳的自動
         更新,這就要求業務系統在更新業務數據時,手工更新時間戳字段。
一:在數據源上增加一個時間戳字段
       時間戳:oracle提供了時間戳數據類型Timestamp,將定義為時間戳數據類型的字段做查詢時,查詢到的結果為:18-4月 -10 03.31.06.000000 下午
     這種格式不太符合我們的需要,用to_char函數把一個日期數據轉換為任何一個我們想要的格式。
     to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')-----將時間戳類型轉換為字符串類型
     oracle還提供了一種日期類型Date,也可以用to_char()轉換成自己想要的格式。
     兩種類型都是對日期和時間的表示,只是兩種類型的精度不同,date精確到秒,而Timestamp精確到小數秒,兩者格式化顯示都一樣。
     to_char函數對兩種類型都支持,但是turnc函數不支持時間戳類型。
                    當兩個時間的差別極其重要時,使用時間戳類型要比日期類型更加精確。
     兩個date類型相減的結果是以天為單位,而兩個時間戳類型相減的結果是直觀的顯示“多少天+多少小時+多少分鍾+多少秒+多少小數秒”;
     例如:
     select to_timestamp('2018-11-11 12:12:12.23','yyyy-mm-dd hh24:mi:ss.ff')-to_timestamp('2018-10-11 12:12:12.23','yyyy-mm-dd hh24:mi:ss.ff') from dual
     結果為:
     查詢結果顯示(多少天 多少小時 多少分鍾 多少秒 多少小數秒 ):000000001 01:30:10.100000
     date類型轉化為timestamp類型要使用cast函數:
     select cast(sysdate as Timestamp) from dual
二:新建time_test表
 CREATE TABLE `time_test` (
   `id` int(10) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) DEFAULT NULL,
   `age` int(3) DEFAULT NULL,
   `time_smp` timestamp NULL DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
三:新建觸發器
 當插入數據時,默認給當前時間;
 當修改數據時,時間戳更新為當前時間;
 以上兩個觸發器都在源表基礎上做修改。
 a:觸發器名稱tri_time_test_insert---插入
    觸發器沒成tri_time_test_update---更新
 b:觸發時間----都在觸發事件之后觸發
 c:執行語句
  插入后-------------------改變思路,將時間戳定義為默認值
  --------------------------更新mysql表中的某一字段,為其設置一個默認值
    ALTER TABLE time_test ALTER COLUMN time_smp SET DEFAULT now();
  d:觸發器沒成tri_time_test_update---更新
 create  trigger tri_time_test_update AFTER update
 on `time_test` FOR EACH ROW
 begin
 set @point=(select name from `time_test` where id = OLD.id ); 
 set @point02=(select age from `time_test` where id = OLD.id );
 if @point != old.name then
 update `time_test` set time_smp=now() where idC=OLD.id;
 end if;
 if @point02 != old.age then
 update `time_test` set time_smp=now() where idC=OLD.id;
 end if;
 end
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM