• MySQL与openGauss 时间操作比较分析


    表创建以及数据打桩

    1. -- mysql
    2. CREATE TABLE `a` (
    3. `b_datetime` DATETIME(6) NULL DEFAULT NULL
    4. )
    5. COLLATE='utf8mb4_0900_ai_ci'
    6. ENGINE=InnoDB
    7. ;
    8. INSERT INTO a VALUES('2022-07-19 11:44:50.674000');
    9. INSERT INTO a VALUES(NULL);
    10. -- opengauss
    11. CREATE TABLE b (
    12. b_datetime timestamp without time zone
    13. )
    14. WITH (orientation=row, compression=no);
    15. INSERT INTO b (b_datetime)VALUES (timestamp '2022-07-19 11:44:50.674000');
    16. INSERT INTO a VALUES(NULL)
    17. -- mysql时间字段datetime 迁移到opengauss 时间字段类型为timestamp

    原始数据查询

    1. #MySQL
    2. select * from a;
    3. +----------------------------+
    4. | b_datetime |
    5. +----------------------------+
    6. | 2022-07-19 11:44:50.674000 |
    7. | NULL |
    8. +----------------------------+
    9. 2 rows in set (0.00 sec)
    10. ===============================================================
    11. #openGauss
    12. select * from test.a;
    13. b_datetime
    14. -------------------------
    15. 2022-07-19 11:44:50.674
    16. (2 rows)
    查询结果:
    mysql         时间输出  年-月-日 时:分:秒.微妙 
    opengauss     时间输出  年-月-日 时:分:秒.微妙 (微妙低位0被抹除)

    TO_CHAR与DATE_FORMAT 时间转换为字符串格式化

    1. #MySQL
    2. SELECT DATE_FORMAT(`b_datetime`, '%Y-%m-%d %H:%i:%s.%f') from `test`.`a`;
    3. +---------------------------------------------------+
    4. | DATE_FORMAT(`b_datetime`, '%Y-%m-%d %H:%i:%s.%f') |
    5. +---------------------------------------------------+
    6. | 2022-07-19 11:44:50.674000 |
    7. | NULL |
    8. +---------------------------------------------------+
    9. 2 rows in set (0.00 sec)
    10. ===============================================================
    11. #openGauss
    12. SELECT to_char(b_datetime, 'YYYY-MM-DD HH24:MI:SS.FF') from "test"."a" ;
    13. to_char
    14. ----------------------------
    15. 2022-07-19 11:44:50.674000
    16. (2 rows)

    查询结果:时间查询结果一致,但是双方对NULL处理方式产生差异。

    时间转字符串,对NULL值进行格式化处理(0000-00-00 00:00:00)

    1. #MySQL
    2. select IFNULL(b_datetime, CAST('0000-00-00 00:00:00' AS date)) from `test`.`a`;
    3. +---------------------------------------------------------+
    4. | IFNULL(b_datetime, CAST('0000-00-00 00:00:00' AS date)) |
    5. +---------------------------------------------------------+
    6. | 2022-07-19 11:44:50.674000 |
    7. | NULL |
    8. +---------------------------------------------------------+
    9. 2 rows in set, 1 warning (0.00 sec)
    10. IFNULL(v1,v2) :如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。 懵逼了
    11. select IFNULL(b_datetime, '0000-00-00 00:00:00') from `test`.`a`;
    12. +-------------------------------------------+
    13. | IFNULL(b_datetime, '0000-00-00 00:00:00') |
    14. +-------------------------------------------+
    15. | 2022-07-19 11:44:50.674000 |
    16. | 0000-00-00 00:00:00 |
    17. +-------------------------------------------+
    18. 2 rows in set (0.00 sec)
    19. IFNULL 内部不进行类型转换 去掉CAST函数 OK了 ,赞一下。
    20. SELECT DATE_FORMAT(IFNULL(b_datetime, '0000-00-00 00:00:00'), '%Y-%m-%d %H:%i:%s.%f') from `test`.`a`;
    21. +--------------------------------------------------------------------------------+
    22. | DATE_FORMAT(IFNULL(b_datetime, '0000-00-00 00:00:00'), '%Y-%m-%d %H:%i:%s.%f') |
    23. +--------------------------------------------------------------------------------+
    24. | 2022-07-19 11:44:50.674000 |
    25. | NULL |
    26. +--------------------------------------------------------------------------------+
    27. 2 rows in set, 1 warning (0.00 sec)
    28. DATE_FORMAT(IFNULL()) 格式化 错误,未到预期结果,郁闷下。DATE_FORMAT 格式化0000-00-00 00:00:00时间返回NULL
    29. SELECT if(`b_datetime` is NULL, '0000-00-00 00:00:00' , DATE_FORMAT(`b_datetime`, '%Y-%m-%d %H:%i:%s.%f')) datetime from `test`.`a`;
    30. +----------------------------+
    31. | datetime |
    32. +----------------------------+
    33. | 2022-07-19 11:44:50.674000 |
    34. | 0000-00-00 00:00:00 |
    35. +----------------------------+
    36. 2 rows in set (0.00 sec)
    37. 使用if(,,)函数,目标达成。赞美自己
    38. ===============================================================
    39. #openGauss
    40. SELECT nvl(to_char(b_datetime, 'YYYY-MM-DD HH24:MI:SS.FF') ,'0000-00-00 00:00:00') datetime from "test"."a" ;
    41. datetime
    42. ----------------------------
    43. 2022-07-19 11:44:50.674000
    44. 0000-00-00 00:00:00
    45. (2 rows)

    #备注
    NULLIF(value1,value2)函数:在mysql和opengauss中都存在,用法一致。 只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。
    IFNULL 函数只有MySQL有,IFNULL(v1,v2) 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
    NVL函数只有opengauss有,NVL(value1,value2) 如果value1为NULL则返回value2,如果value1非NULL,则返回value1。

    日期转为时间戳

    1. #MySQL
    2. SELECT UNIX_TIMESTAMP(b_datetime),b_datetime from `test`.`a`;
    3. +----------------------------+----------------------------+
    4. | UNIX_TIMESTAMP(b_datetime) | b_datetime |
    5. +----------------------------+----------------------------+
    6. | 1658202290.674000 | 2022-07-19 11:44:50.674000 |
    7. | NULL | NULL |
    8. +----------------------------+----------------------------+
    9. 2 rows in set (0.00 sec)
    10. SELECT UNIX_TIMESTAMP(b_datetime)*1000,b_datetime from `test`.`a`;
    11. +---------------------------------+----------------------------+
    12. | UNIX_TIMESTAMP(b_datetime)*1000 | b_datetime |
    13. +---------------------------------+----------------------------+
    14. | 1658202290674.000000 | 2022-07-19 11:44:50.674000 |
    15. | NULL | NULL |
    16. +---------------------------------+----------------------------+
    17. 2 rows in set (0.00 sec)
    18. SELECT UNIX_TIMESTAMP(b_datetime)*1000000,b_datetime from `test`.`a`;
    19. +------------------------------------+----------------------------+
    20. | UNIX_TIMESTAMP(b_datetime)*1000000 | b_datetime |
    21. +------------------------------------+----------------------------+
    22. | 1658202290674000.000000 | 2022-07-19 11:44:50.674000 |
    23. | NULL | NULL |
    24. +------------------------------------+----------------------------+
    25. 2 rows in set (0.00 sec)
    26. ===============================================================
    27. #openGauss
    28. select extract(epoch from b_datetime) datetime,b_datetime from "test"."a";
    29. datetime | b_datetime
    30. ----------------+-------------------------
    31. 1658231090.674 | 2022-07-19 11:44:50.674
    32. |
    33. (2 rows)
    34. select extract(epoch from b_datetime)*1000 datetime,b_datetime from "test"."a";
    35. datetime | b_datetime
    36. ---------------+-------------------------
    37. 1658231090674 | 2022-07-19 11:44:50.674
    38. |
    39. (2 rows)
    40. select extract(epoch from b_datetime)*1000000 datetime,b_datetime from "test"."a";
    41. datetime | b_datetime
    42. --------------------+-------------------------
    43. 1.658231090674e+15 | 2022-07-19 11:44:50.674
    44. |
    45. (2 rows)
    # 数据分析:
    opengauss在微妙转换时,达到16位会进行数据转换,转为科学计数
    另mysql和opengauss 再讲时间转换为毫秒时,产生数据差异:
    opengauss   1658231090674
    mysql      1658202290674.000000
    1. select (1658231090674 - 1658202290674) time_diff ,(1658231090674 - 1658202290674)/(1000*60*60*8) _8hour;
    2. time_diff | _8hour
    3. -----------+--------
    4. 28800000 | 1
    5. (1 row)

    opengauss 和mysql 转换时间戳,基于时区处理。这里要考虑数据库时间的时区属性。

  • 相关阅读:
    音视频 fmpeg命令裁剪和合并视频
    (七)Flask之路由转换器
    java计算机毕业设计幼儿早教系统软件设计与实现MyBatis+系统+LW文档+源码+调试部署
    VMware Aria Automation 8.10 - 现代基础架构自动化平台
    Django模块连接redis
    实战:django项目环境搭建(pycharm,virtualBox)
    UITableViewHeader自适应的几种方法
    Install Stable Diffusion WebUI on Ubuntu 22.04.2 LTS
    进阶实验4-3.4 笛卡尔树(PTA)(二叉搜索树的判断 + 最小堆(优先队列)的判断 )
    CTF反序列化wp(ciscn,nss,ctfshowweb入门)
  • 原文地址:https://blog.csdn.net/wang4721/article/details/126556353