銀行數據庫遷移至MySQL,竟被時間字段這玩意耍了……

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"背景介紹"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"筆者在工作中曾遇到SyBase數據庫遷移至MySQL時的一個問題:使用bcp將SyBase中的數據導出爲csv文件時,datetime數據類型默認導出格式與MySQL不兼容。Sybase默認的datetime類型格式爲Mmm dd yyyy hh:nn:ss:sssAA,示例如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"Dec 24 2017 12:00:00:000PM\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而MySQL中datetime類型格式爲yyyy-mm-dd hh:nn:ss,示例如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"2017-12-24 12:00:00"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此直接將csv文件導入MySQL會由於不兼容導致報錯。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"解決方式"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"解決此問題的方式不外乎兩種:一是修改導出後的csv文件,令其時間字段的數據格式兼容MySQL;二是修改SyBase數據庫中時間字段的數據格式,使其直接能通過bcp導出兼容MySQL的csv文件。鑑於第一種方法較爲複雜,本文筆者採用第二種方法解決該問題。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1、convert()函數介紹"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"convert()函數是SyBase數據庫中用於數據類型轉換的函數,其使用方式如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"convert(datatype,expression,[format-style])"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"datatype:必選參數,將要轉換成的數據類型;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"expression:必選參數,待轉換的字段;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"format-style:可選參數,轉換時間類型時,決定輸出格式的參數,對應關係見下表:"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"embedcomp","attrs":{"type":"table","data":{"content":"

format-style的值

輸出格式

輸出示例

100

Mmm dd yyyy hh:nnAA

Dec 24 2017 12:00PM

101

mm\/dd\/yyyy

12\/24\/2017

102

yyyy.mm.dd

2017.12.24

103

dd\/mm\/yyyy

24\/12\/2017

104

dd.mm.yyyy

24.12.2017

105

dd-mm-yyyy

24-12-2017

106

dd Mmm yyyy

24 Dec 2017

107

Mmm dd,yyyy

Dec 24,2017

108

hh:nn:ss

12:00:00

109

Mmm dd yyyy hh:nn:ss:sssAA

Dec 24 2017 12:00:00:000PM

110

mm-dd-yyyy

12-24-2017

111

yyyy\/mm\/dd

2017\/12\/24

112

yyyymmdd

20171224"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如有一個名爲test的表,將該表中一個名爲changetime,類型爲datetime的字段轉換爲varchar類型,可以使用如下SQL語句:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\nselect convert(varchar(100),changetime,111) as dates from test;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"若該字段僅有一行數據,其值爲Dec 24 2017 12:00:00:000PM,那麼以上SQL輸出的結果爲2017\/12\/24."}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2、str_replace()函數介紹"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"str_replace()參數用於替換字符串中的部分字符,其使用方式如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"str_replace(‘string1’,’string2’,’string3’)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"參數含義:"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"string1:必選參數,原始字符串;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"string2:必選參數,待轉換的字符;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"string3:必選參數,需要轉換成的字符;"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如以下SQL:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"select str_replace(‘2017\/12\/24’,’\/’,’-’);"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其輸出結果爲2017-12-24."}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3、具體方案實施"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由以上示例可見,若將SyBase中datetime類型字段使用convert()函數轉換爲varchar類型,format-style的值指定爲111,再使用str_replace()函數,將convert()轉換來的字符串中的’\/’轉換爲’-’,即可滿足MySQL中對datetime類型的格式要求(yyyy-mm-dd);同理,format-style的值指定爲108,即可滿足hh:nn:ss的格式要求。具體的實施方案舉例說明如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)在SyBase數據庫建立一張臨時表tmp,表結構與待導出數據的表test一致,僅datetime類型字段改爲varchar類型;表結構見以下SQL語句:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"create table test(id int,time datetime);\ncreate table tmp(id int,time varchar(100));"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)採用如下SQL語句將原始表的數據存入臨時表中:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"insert into tmp select id,str_replace(convert(varchar(100),time,111),'\/','-')\n+' '+convert(varchar(100),time,108) from test;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)將臨時表tmp中的數據使用bcp命令導出爲csv文件;"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4)將csv文件中的數據導入MySQL數據庫對應表中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"至此,解決了SyBase中datetime類型字段默認導出格式與MySQL不兼容的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"作者介紹"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"農行研發中心“數風雲”團隊,"},{"type":"text","text":"一支朝氣蓬勃、快速成長的技術團隊,始終致力於農行大數據、數據庫和雲計算等領域的應用實踐與技術創新,探索數據賦能,勇攀數據雲巔,爲企業數字化轉型和金融科技發展不斷貢獻力量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文轉載自:dbaplus社羣(ID:dbaplus)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"},{"type":"link","attrs":{"href":"https:\/\/mp.weixin.qq.com\/s\/HsoFd9vtWTCQYElcRvdT8Q","title":"xxx","type":null},"content":[{"type":"text","text":"銀行數據庫遷移至MySQL,竟被時間字段這玩意耍了……"}]}]}]}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章