作者介紹
農行研發中心“數風云”團隊,一支朝氣蓬勃、快速成長的技術團隊,始終致力于農行大數據、數據庫和云計算等領域的應用實踐與技術創新,探索數據賦能,勇攀數據云巔,為企業數字化轉型和金融科技發展不斷貢獻力量。
背景介紹
筆者在工作中曾遇到SyBase數據庫遷移至MySQL時的一個問題:使用bcp將SyBase中的數據導出為csv文件時,datetime數據類型默認導出格式與MySQL不兼容。Sybase默認的datetime類型格式為Mmm dd yyyy hh:nn:ss:sssAA,示例如下:
Dec 24 2017 12:00:00:000PM
而MySQL中datetime類型格式為yyyy-mm-dd hh:nn:ss,示例如下:
2017-12-24 12:00:00
因此直接將csv文件導入MySQL會由于不兼容導致報錯。
解決方式
解決此問題的方式不外乎兩種:一是修改導出后的csv文件,令其時間字段的數據格式兼容MySQL;二是修改SyBase數據庫中時間字段的數據格式,使其直接能通過bcp導出兼容MySQL的csv文件。鑒于第一種方法較為復雜,本文筆者采用第二種方法解決該問題。
1、convert()函數介紹
convert()函數是SyBase數據庫中用于數據類型轉換的函數,其使用方式如下:
convert(datatype,expression,[format-style])
- datatype:必選參數,將要轉換成的數據類型;
- expression:必選參數,待轉換的字段;
- format-style:可選參數,轉換時間類型時,決定輸出格式的參數,對應關系見下表:
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 |
例如有一個名為test的表,將該表中一個名為changetime,類型為datetime的字段轉換為varchar類型,可以使用如下SQL語句:
select convert(varchar(100),changetime,111) as dates from test;
若該字段僅有一行數據,其值為Dec 24 2017 12:00:00:000PM,那么以上SQL輸出的結果為2017/12/24.
2、str_replace()函數介紹
str_replace()參數用于替換字符串中的部分字符,其使用方式如下:
str_replace(‘string1’,’string2’,’string3’)
參數含義:
- string1:必選參數,原始字符串;
- string2:必選參數,待轉換的字符;
- string3:必選參數,需要轉換成的字符;
例如以下SQL:
select str_replace(‘2017/12/24’,’/’,’-’);
其輸出結果為2017-12-24.
3、具體方案實施
由以上示例可見,若將SyBase中datetime類型字段使用convert()函數轉換為varchar類型,format-style的值指定為111,再使用str_replace()函數,將convert()轉換來的字符串中的’/’轉換為’-’,即可滿足MySQL中對datetime類型的格式要求(yyyy-mm-dd);同理,format-style的值指定為108,即可滿足hh:nn:ss的格式要求。具體的實施方案舉例說明如下:
1)在SyBase數據庫建立一張臨時表tmp,表結構與待導出數據的表test一致,僅datetime類型字段改為varchar類型;表結構見以下SQL語句:
create table test(id int,time datetime);
create table tmp(id int,time varchar(100));
2)采用如下SQL語句將原始表的數據存入臨時表中:
insert into tmp select id,str_replace(convert(varchar(100),time,111),'/','-')
+' '+convert(varchar(100),time,108) from test;
3)將臨時表tmp中的數據使用bcp命令導出為csv文件;
4)將csv文件中的數據導入MySQL數據庫對應表中。
至此,解決了SyBase中datetime類型字段默認導出格式與MySQL不兼容的問題。
關注公眾號【dbaplus社群】,獲取更多原創技術文章和精選工具下載