开发者社区> 问答> 正文

从MySQL 到 Oracle :datetime字段同步的时分秒变成零,只留下年月日!

从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

展开
收起
大圣东游 2023-06-21 17:22:22 191 0
3 条回答
写回答
取消 提交回答
  • 随心分享,欢迎友善交流讨论:)

    您在从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类型。

    需要注意的是,数据类型转换可能会影响到数据的精度和时区。如果您的应用程序需要精确到毫秒或者需要考虑时区等因素,需要仔细考虑数据类型转换的方法,以确保数据的精确度和一致性。

    希望这些信息能够帮助您解决问题。

    2023-06-30 09:27:43
    赞同 展开评论 打赏
  • AbstractDbDialect.findTable()返回的oracle的DATE类型为91,是不带time的. 可参见:http://db.apache.org/ddlutils/databases/oracle.html 建议oracle使用TIMESTAMP类型

    还有一种办法是关闭类型自动反查功能,认为mysql和oracle类型都是一致的, otter不自动做类型处理. 关闭高级参数里的类型转换功能

    原回答者GitHub用户agapple

    2023-06-21 18:25:35
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    这是一个常见的同步问题。

    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表结构,然后修改同步逻辑保持数据一致性。

    2023-06-21 18:14:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像