最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

银行数据库迁移至 MySQL,竟被时间字段这玩意耍了……

  • 2021-05-28
  • 本文字数:1331 字

    阅读完需:约 4 分钟

银行数据库迁移至MySQL,竟被时间字段这玩意耍了……

背景介绍

笔者在工作中曾遇到 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 社群(ID:dbaplus)

原文链接:银行数据库迁移至MySQL,竟被时间字段这玩意耍了……

2021-05-28 08:001568

评论

发布
暂无评论
发现更多内容

架构训练营-第10期-模块2作业

Geek_4db2d5

Python开发游戏?也太好用了吧!

Jackpop

实战整了一个后台服务,真香!

风铃架构日知录

多线程 线程池 网络 HTTP CGI

聊聊好牛的 MySQL 日志设计!

风铃架构日知录

MySQL Java、 sql java\ Undo Log

Chrome浏览器竟然可以用ChatGPT了!

Jackpop

2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选

科技热闻

Atlassian FaaS 云开发平台Forge解析

填空时光

敏捷 Faas Atlassian Jira

设备资产管理系统有什么用?

优秀

设备管理 设备资产管理系统

ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好

EOSdreamer111

数据库原理及MySQL应用 | 数据库安全加固

TiAmo

安全 数据库· 12月月更

ZBC陆续在主要CEX开启Staking成近期利好,锁定市场大部分流通量

西柚子

ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好

鳄鱼视界

相见恨晚!Git这些功能太好用了!

Jackpop

一文了解 Dubbo 的代码架构

Apache Dubbo

Java 开源 源码 微服务 云原生

模块2

KING

数据权限就该这么设计!!!

小小怪下士

Java 程序员 数据权限

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景

洛神灬殇

分布式事务 RocketMQ 可靠消息最终一致 12 月 PK 榜

ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好

BlockChain先知

ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好

股市老人

Vue进阶(贰零柒):Webpack 性能优化措施汇总

No Silver Bullet

性能优化 Vue webpack 12月月更

架构实战营模块8作业

冷夫冲

架构 构架 「架构实战营」

SpringBoot整合Swagger2,再也不用维护接口文档了!

@下一站

12月日更 12月月更 springboot整合 swagger2

专利进阶(一):软件专利工程师浅谈如何针对计算机软件类专利申请进行技术挖掘

No Silver Bullet

专利 12月月更 软件专利工程师 技术挖掘

数据权限就该这么设计!!!

风铃架构日知录

数据 优化 数据权限 rbac 数据库权限

性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出、FullGC频繁检测手段-总结与分享

C++后台开发

性能优化 后端开发 内存泄漏 linux开发 C++开发

SQL查找是否"存在",别再count了!

风铃架构日知录

MySQL 后端 Java、 java程序员 sql

C++开发,这些GUI库一定不要错过!

Jackpop

2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k

福大大架构师每日一题

golang 算法 福大大

2022中国产业数字化发展成熟度区域指数分析——充分利用特长,形成区域比较优势,夯实中国式现代化建设基础

易观分析

数字化 产业

chatGPT的49种应用场景介绍,各开发语言接入chatGPT参考指南

非喵鱼

Java Python 前端 编程语言 ChatGPT

AngularJS进阶(四十二)ng-options渲染的第一项为空问题分析及解决方案

No Silver Bullet

12月月更 ng-options 页面渲染 上拉加载

银行数据库迁移至MySQL,竟被时间字段这玩意耍了……_数据库_dbaplus社群_InfoQ精选文章