从MySQL 到 Oracle :datetime字段同步的时分秒变成零,只留下年月日! 例如:
MySQL:tel_phone表字段为id int,name varchar(100),create_time datetime;
数据为:1,‘老李’,‘2014-10-10 10:10:10’
则同步到Oracle中数据变为: 1,‘老李’,‘2014-10-10 00:00:00’
注:单行同步,并未开启数据一致性校验! 版本:4.2.11 系统:CentOS 6.2
原提问者GitHub用户 qianxiansheng90
您在从MySQL到Oracle进行数据同步时,发现datetime字段的时分秒被截断了,只保留了年月日。这个问题可能是由于Oracle数据库和MySQL数据库在日期时间类型的存储和处理方式上的差异引起的。
Oracle数据库在处理日期时间类型时,使用的是自己的内部格式,称为“日期类型”(DATE)。日期类型存储日期和时间,精确到秒,但不包括时区信息。而MySQL数据库中的datetime类型也存储日期和时间,精确到秒,但是使用了与Oracle不同的存储格式。
因此,在进行MySQL到Oracle的数据同步时,需要考虑到两个数据库的日期时间类型之间的差异,并进行相应的数据类型转换。具体来说,您可以在同步过程中使用数据处理逻辑,将MySQL数据库中的datetime类型转换为Oracle数据库中的DATE类型。例如,可以使用以下逻辑来进行转换:
TO_DATE(date_format(create_time, '%Y-%m-%d %H:%i:%s'), 'YYYY-MM-DD HH24:MI:SS') 这里,date_format函数用于将MySQL的datetime类型转换为字符串类型,然后使用Oracle的TO_DATE函数将其转换为DATE类型。
需要注意的是,数据类型转换可能会影响到数据的精度和时区。如果您的应用程序需要精确到毫秒或者需要考虑时区等因素,需要仔细考虑数据类型转换的方法,以确保数据的精确度和一致性。
希望这些信息能够帮助您解决问题。
AbstractDbDialect.findTable()返回的oracle的DATE类型为91,是不带time的. 可参见:http://db.apache.org/ddlutils/databases/oracle.html 建议oracle使用TIMESTAMP类型
还有一种办法是关闭类型自动反查功能,认为mysql和oracle类型都是一致的, otter不自动做类型处理. 关闭高级参数里的类型转换功能
原回答者GitHub用户agapple
这是一个常见的同步问题。
MySQL中的DATETIME类型对应的Oracle中没有完全对应的类型。
Oracle中最近的对应类型是TIMESTAMP,但是TIMESTAMP默认情况下不存储时分秒,只存储年月日。
有几个解决方案:
使用TIMESTAMP WITH TIME ZONE类型 这种类型会存储完整的日期时间,包括时分秒。
sql Copy create table tel_phone( id int, name varchar2(100), create_time TIMESTAMP WITH TIME ZONE ); 使用VARCHAR2存储日期时间字符串 sql Copy create table tel_phone( id int, name varchar2(100),
create_time VARCHAR2(50) ); 然后同步数据的时候把MySQLDATETIME转换成指定格式的字符串再插入到Oracle。
使用两个列分别存储日期和时间 sql Copy create table tel_phone( id int, name varchar2(100), create_date DATE, create_time TIMESTAMP
); 同步数据的时候分别将MySQL DATETIME的日期部分插入create_date,时分秒部分插入create_time。
以上三种方式都可以正确存储MySQLDATETIME对应的时分秒信息。
你需要根据自己的业务选择其中一种来修改Oracle表结构,然后修改同步逻辑保持数据一致性。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。