写点什么

【YashanDB 知识库】MySQL 的 FROM_UNIXTIME 和 UNIX_TIMESTAMP 如何在 YashanDB 改写

作者:YashanDB
  • 2025-02-07
    广东
  • 本文字数:1263 字

    阅读完需:约 4 分钟

本文内容来自 YashanDB 官网,原文内容请见https://www.yashandb.com/newsinfo/7352691.html?templateId=1718516


前言

MySQL 应用常使用 FROM_UNIXTIME 和 UNIX_TIMESTAMP 函数,但是无法在 YashanDB 直接执行,需要改写。本文探讨如何利用 YashanDB 高度兼容 Oracle 的特点快速完成函数改写的方案。

 

问题

MySQL 示例使用 FROM_UNIXTIME 和 UNIX_TIMESTAMP,执行成功

mysql> select FROM_UNIXTIME( 8640000 + UNIX_TIMESTAMP('2024-01-01 00:00:00')) from dual;
+-------------------------------------------------------------------+
| FROM_UNIXTIME( 8640000 + UNIX_TIMESTAMP('2024-01-01 00:00:00')) |
+-------------------------------------------------------------------+
| 2024-04-10 00:00:00 |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)
复制代码


YashanDB 报错

SQL> select FROM_UNIXTIME( 8640000 + UNIX_TIMESTAMP('2024-01-01 00:00:00')) from dual;

[1:8]YAS-04243 invalid identifier "FROM_UNIXTIME"
复制代码


解决方法

思考

MySQL 的常用函数 FROM_UNIXTIME 和 UNIX_TIMESTAMP,没有在 YashanDB 实现。但是,由于 YashanDB 高度兼容 Oracle,而应用从 MySQL 数据库切换到 Oracle 数据库,也是常见的数据库切换。因此,可以先借鉴 Oracle 如何兼容 MySQL 的常用函数 FROM_UNIXTIME 和 UNIX_TIMESTAMP。

 

改写方案

通过搜索,找到 Oracle 的改写方法:https://forums.oracle.com/ords/apexds/post/functions-unix-timestamp-and-from-unixtime-from-mysql-to-or-2594。利用 YashanDB 高度兼容 Oracle 的特点,借鉴 Oracle 的改写方法,实现 YashanDB 的 FROM_UNIXTIME 和 UNIX_TIMESTAMP 函数:

CREATE OR REPLACE FUNCTION SYS.FROM_UNIXTIME
(
TIMESTAMP_ IN NUMBER
) RETURN DATE AS
SECONDS_PER_DAY NUMBER := 86400;
MASK VARCHAR2(50 CHAR) := 'YYYY-MM-DD HH24:MI:SS';
REF_DATE DATE;
BEGIN
REF_DATE := TO_DATE('1970-01-01 00:00:00', MASK);
RETURN REF_DATE + (TIMESTAMP_/SECONDS_PER_DAY);
END FROM_UNIXTIME;
/


CREATE OR REPLACE FUNCTION SYS.UNIX_TIMESTAMP
(
DATE_ IN DATE
) RETURN NUMBER AS
SECONDS_PER_DAY NUMBER := 86400;
DIFF_BETWEEN_DATES NUMBER;
MASK VARCHAR2(50 CHAR) := 'YYYY-MM-DD HH24:MI:SS';
REF_DATE DATE;
BEGIN
REF_DATE := TO_DATE('1970-01-01 00:00:00', MASK);
DIFF_BETWEEN_DATES := DATE_ - REF_DATE;
RETURN DIFF_BETWEEN_DATES * SECONDS_PER_DAY;
END UNIX_TIMESTAMP;
/

CREATE PUBLIC SYNONYM FROM_UNIXTIME FOR SYS.FROM_UNIXTIME;
CREATE PUBLIC SYNONYM UNIX_TIMESTAMP FOR SYS.UNIX_TIMESTAMP;
复制代码


成果

实现 YashanDB 的 FROM_UNIXTIME 和 UNIX_TIMESTAMP 函数,YashanDB 报错的问题得到解决

SQL> select FROM_UNIXTIME( 8640000 + UNIX_TIMESTAMP('2024-01-01 00:00:00')) from dual;

FROM_UNIXTIME(864000
------------------------------------------------
2024-04-10 00:00:00

1 row fetched.
复制代码


发布于: 刚刚阅读数: 2
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】MySQL的FROM_UNIXTIME和UNIX_TIMESTAMP如何在YashanDB改写_数据库_YashanDB_InfoQ写作社区