- -- mysql
- CREATE TABLE `a` (
- `b_datetime` DATETIME(6) NULL DEFAULT NULL
- )
- COLLATE='utf8mb4_0900_ai_ci'
- ENGINE=InnoDB
- ;
-
- INSERT INTO a VALUES('2022-07-19 11:44:50.674000');
- INSERT INTO a VALUES(NULL);
-
- -- opengauss
-
- CREATE TABLE b (
- b_datetime timestamp without time zone
- )
- WITH (orientation=row, compression=no);
- INSERT INTO b (b_datetime)VALUES (timestamp '2022-07-19 11:44:50.674000');
- INSERT INTO a VALUES(NULL)
-
-
- -- mysql时间字段datetime 迁移到opengauss 时间字段类型为timestamp
- #MySQL
- select * from a;
- +----------------------------+
- | b_datetime |
- +----------------------------+
- | 2022-07-19 11:44:50.674000 |
- | NULL |
- +----------------------------+
- 2 rows in set (0.00 sec)
- ===============================================================
- #openGauss
- select * from test.a;
- b_datetime
- -------------------------
- 2022-07-19 11:44:50.674
-
-
- (2 rows)
- #MySQL
- SELECT DATE_FORMAT(`b_datetime`, '%Y-%m-%d %H:%i:%s.%f') from `test`.`a`;
- +---------------------------------------------------+
- | DATE_FORMAT(`b_datetime`, '%Y-%m-%d %H:%i:%s.%f') |
- +---------------------------------------------------+
- | 2022-07-19 11:44:50.674000 |
- | NULL |
- +---------------------------------------------------+
- 2 rows in set (0.00 sec)
- ===============================================================
- #openGauss
- SELECT to_char(b_datetime, 'YYYY-MM-DD HH24:MI:SS.FF') from "test"."a" ;
- to_char
- ----------------------------
- 2022-07-19 11:44:50.674000
-
- (2 rows)
查询结果:时间查询结果一致,但是双方对NULL处理方式产生差异。
- #MySQL
- select IFNULL(b_datetime, CAST('0000-00-00 00:00:00' AS date)) from `test`.`a`;
- +---------------------------------------------------------+
- | IFNULL(b_datetime, CAST('0000-00-00 00:00:00' AS date)) |
- +---------------------------------------------------------+
- | 2022-07-19 11:44:50.674000 |
- | NULL |
- +---------------------------------------------------------+
- 2 rows in set, 1 warning (0.00 sec)
-
- IFNULL(v1,v2) :如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。 懵逼了
-
- select IFNULL(b_datetime, '0000-00-00 00:00:00') from `test`.`a`;
- +-------------------------------------------+
- | IFNULL(b_datetime, '0000-00-00 00:00:00') |
- +-------------------------------------------+
- | 2022-07-19 11:44:50.674000 |
- | 0000-00-00 00:00:00 |
- +-------------------------------------------+
- 2 rows in set (0.00 sec)
-
-
- IFNULL 内部不进行类型转换 去掉CAST函数 OK了 ,赞一下。
-
- SELECT DATE_FORMAT(IFNULL(b_datetime, '0000-00-00 00:00:00'), '%Y-%m-%d %H:%i:%s.%f') from `test`.`a`;
- +--------------------------------------------------------------------------------+
- | DATE_FORMAT(IFNULL(b_datetime, '0000-00-00 00:00:00'), '%Y-%m-%d %H:%i:%s.%f') |
- +--------------------------------------------------------------------------------+
- | 2022-07-19 11:44:50.674000 |
- | NULL |
- +--------------------------------------------------------------------------------+
- 2 rows in set, 1 warning (0.00 sec)
-
- DATE_FORMAT(IFNULL()) 格式化 错误,未到预期结果,郁闷下。DATE_FORMAT 格式化0000-00-00 00:00:00时间返回NULL
-
- 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`;
- +----------------------------+
- | datetime |
- +----------------------------+
- | 2022-07-19 11:44:50.674000 |
- | 0000-00-00 00:00:00 |
- +----------------------------+
- 2 rows in set (0.00 sec)
-
- 使用if(,,)函数,目标达成。赞美自己
-
- ===============================================================
- #openGauss
-
- SELECT nvl(to_char(b_datetime, 'YYYY-MM-DD HH24:MI:SS.FF') ,'0000-00-00 00:00:00') datetime from "test"."a" ;
- datetime
- ----------------------------
- 2022-07-19 11:44:50.674000
- 0000-00-00 00:00:00
- (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。
- #MySQL
- SELECT UNIX_TIMESTAMP(b_datetime),b_datetime from `test`.`a`;
- +----------------------------+----------------------------+
- | UNIX_TIMESTAMP(b_datetime) | b_datetime |
- +----------------------------+----------------------------+
- | 1658202290.674000 | 2022-07-19 11:44:50.674000 |
- | NULL | NULL |
- +----------------------------+----------------------------+
- 2 rows in set (0.00 sec)
-
- SELECT UNIX_TIMESTAMP(b_datetime)*1000,b_datetime from `test`.`a`;
- +---------------------------------+----------------------------+
- | UNIX_TIMESTAMP(b_datetime)*1000 | b_datetime |
- +---------------------------------+----------------------------+
- | 1658202290674.000000 | 2022-07-19 11:44:50.674000 |
- | NULL | NULL |
- +---------------------------------+----------------------------+
- 2 rows in set (0.00 sec)
-
- SELECT UNIX_TIMESTAMP(b_datetime)*1000000,b_datetime from `test`.`a`;
- +------------------------------------+----------------------------+
- | UNIX_TIMESTAMP(b_datetime)*1000000 | b_datetime |
- +------------------------------------+----------------------------+
- | 1658202290674000.000000 | 2022-07-19 11:44:50.674000 |
- | NULL | NULL |
- +------------------------------------+----------------------------+
- 2 rows in set (0.00 sec)
-
- ===============================================================
- #openGauss
-
- select extract(epoch from b_datetime) datetime,b_datetime from "test"."a";
- datetime | b_datetime
- ----------------+-------------------------
- 1658231090.674 | 2022-07-19 11:44:50.674
- |
- (2 rows)
-
- select extract(epoch from b_datetime)*1000 datetime,b_datetime from "test"."a";
- datetime | b_datetime
- ---------------+-------------------------
- 1658231090674 | 2022-07-19 11:44:50.674
- |
- (2 rows)
-
- select extract(epoch from b_datetime)*1000000 datetime,b_datetime from "test"."a";
- datetime | b_datetime
- --------------------+-------------------------
- 1.658231090674e+15 | 2022-07-19 11:44:50.674
- |
- (2 rows)
- select (1658231090674 - 1658202290674) time_diff ,(1658231090674 - 1658202290674)/(1000*60*60*8) _8hour;
- time_diff | _8hour
- -----------+--------
- 28800000 | 1
- (1 row)
opengauss 和mysql 转换时间戳,基于时区处理。这里要考虑数据库时间的时区属性。