暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 毫秒值和时间(戳)互相转换

原创 Jeff 2022-12-15
6217

Oracle 毫秒值和时间(戳)互相转换

-- 当前毫秒时间戳转毫秒 SELECT SYSTIMESTAMP(3),to_char((SYSDATE - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000 /*24 * 60 * 60 * 1000*/ + TO_NUMBER(TO_CHAR(SYSTIMESTAMP(3), 'FF'))) AS milliseconds FROM DUAL; SYSTIMESTAMP(3) MILLISECONDS --------------------------------------- -------------------- 15-DEC-22 10.54.35.272 AM +08:00 1671072875272 -- 当前微秒时间戳转微秒 SELECT SYSTIMESTAMP(6),to_char((SYSDATE - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000000 /*24 * 60 * 60 * 1000 *1000*/ + TO_NUMBER(TO_CHAR(SYSTIMESTAMP(6), 'FF'))) AS microseconds FROM DUAL; SYSTIMESTAMP(6) MICROSECONDS --------------------------------------- ------------------- 15-DEC-22 10.55.06.618041 AM +08:00 1671072906618041 -- 日期时间转毫秒(丢失毫秒) SELECT TO_CHAR(TO_NUMBER(SYSDATE - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000) MILLISECONDS FROM DUAL; MILLISECONDS ------------- 1669678245000 -- 毫秒转时间戳(字符型)忽略了隐式转换 SELECT TO_CHAR(TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH:MI:SS') + 1671072875272 / (1000 * 60 * 60 * 24), 'YYYY-MM-DD HH:MI:SS')||'.'||substr(1671072875272,-3) AS CHAR_Timestamp FROM DUAL; CHAR_TIMESTAMP ----------------------- 2022-12-15 10:54:35.272 -- 毫秒转时间戳(时间戳类型) SELECT TO_TIMESTAMP(TO_CHAR(TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH:MI:SS') + 1671072875272 / (1000 * 60 * 60 * 24), 'YYYY-MM-DD HH:MI:SS')||'.'||substr(1671072875272,-3),'YYYY-MM-DD HH24:MI:SS.FF3') AS Trans_Timestamp FROM DUAL; TRANS_TIMESTAMP ------------------------------------- 15-DEC-22 10.54.35.272000000 AM -- 毫秒转时间,丢失毫秒 SELECT TO_CHAR(TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH:MI:SS') + 1671072875272 / (1000 * 60 * 60 * 24), 'YYYY-MM-DD HH:MI:SS') AS CHAR_DATE FROM DUAL; CHAR_DATE ------------------- 2022-12-15 10:54:35 -- 定义函数实现毫秒转时间戳 -- 定义后授权Public,该实例是使用 SYSTEM 用户建立函数: -- CREATE PUBLIC SYNONYM MILLI2TIMESTAMPCST FOR SYSTEM.MILLI2TIMESTAMPCST; -- CREATE PUBLIC SYNONYM MILLISECONDS2TIMESTAMPCST FOR SYSTEM.MILLISECONDS2TIMESTAMPCST; -- 使用 SELECT MILLISECONDS2TIMESTAMPCST (1671072875272) Char_Timestamp FROM DUAL; CHAR_TIMESTAMP --------------------------------------------------------------------------- 15-DEC-22 10.54.35.272000000 AM -- 创建函数方法1 CREATE OR REPLACE FUNCTION MILLI2TIMESTAMPCST (I_MILLISECONDS NUMBER) /************************************************************************************************ 名称:MILLI2TIMESTAMPCST 功能:将1970-01-01 08:00:00以来的毫秒数转换为东八区(北京)timestamp时间类型,精确保留毫秒级精度! 参数:I_MILLISECONDS NUMBER 待转换的毫秒数 示例:SELECT MILLI2TIMESTAMPCST (1671072875272) FROM DUAL; ************************************************************************************************/ RETURN TIMESTAMP AS V_TIMESTAMPSTR TIMESTAMP(3); BEGIN SELECT TO_TIMESTAMP ( TO_CHAR ( TO_DATE ('1970-01-01 08:00:00', 'YYYY-MM-DD HH:MI:SS') + I_MILLISECONDS / (1000 * 60 * 60 * 24), 'YYYY-MM-DD HH:MI:SS') || '.' || SUBSTR (I_MILLISECONDS, -3), 'YYYY-MM-DD HH24:MI:SS.FF3') AS Trans_Timestamp INTO V_TIMESTAMPSTR FROM DUAL; RETURN V_TIMESTAMPSTR; EXCEPTION WHEN OTHERS THEN RETURN NULL; END; -- 创建函数方法2 CREATE OR REPLACE FUNCTION MILLISECONDS2TIMESTAMPCST (I_MILLISECONDS NUMBER) /************************************************************************************************ 名称:MILLISECONDS2TIMESTAMPCST 功能:将1970-01-01 00:00:00以来的毫秒数转换为东八区(北京)timestamp时间类型,精确保留毫秒级精度! 参数:I_MILLISECONDS NUMBER 待转换的毫秒数 示例:select MILLISECONDS2TIMESTAMPCST(1671072875272) from dual; ************************************************************************************************/ RETURN TIMESTAMP AS V_TIMESTAMPSTR VARCHAR2 (17); BEGIN SELECT TO_CHAR ( TO_TIMESTAMP ('1970-01-01', 'yyyy-MM-dd') + TRUNC ( ( I_MILLISECONDS - ( MOD ( ( I_MILLISECONDS - ( MOD ( ( I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60) * 1000 + MOD (I_MILLISECONDS, 1000))) / 1000 / 60, 60) * 60 * 1000 + MOD ( ( I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60) * 1000 + MOD (I_MILLISECONDS, 1000))) / 1000 / 60 / 60 / 24), 'yyyyMMdd') || --日期 LPAD ( MOD ( ( I_MILLISECONDS - ( MOD ( ( I_MILLISECONDS - ( MOD ( ( I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60) * 1000 + MOD (I_MILLISECONDS, 1000))) / 1000 / 60, 60) * 60 * 1000 + MOD ( ( I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60) * 1000 + MOD (I_MILLISECONDS, 1000))) / 1000 / 60 / 60, 24), 2, 0) || --小时 LPAD ( MOD ( ( I_MILLISECONDS - ( MOD ( ( I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60) * 1000 + MOD (I_MILLISECONDS, 1000))) / 1000 / 60, 60), 2, 0) || --分钟 LPAD ( MOD ((I_MILLISECONDS - MOD (I_MILLISECONDS, 1000)) / 1000, 60), 2, 0) || --秒 LPAD (MOD (I_MILLISECONDS, 1000), 3, 0) --毫秒 INTO V_TIMESTAMPSTR FROM DUAL; RETURN TO_TIMESTAMP (V_TIMESTAMPSTR, 'yyyyMMddhh24missff3') + INTERVAL '8' HOUR; EXCEPTION WHEN OTHERS THEN RETURN NULL; END;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论