Oracle【低版本实现UTC格式转换】

Oracle低版本实现UTC格式转换


文章目录


前言

现在Oracle版本过低是不能直接转UTC格式时间的,那么我们低版本用户可以以下这样做


一、创建 FUNCTION(GET_UTC_DATE)

sql 复制代码
CREATE OR REPLACE FUNCTION GET_UTC_DATE (V_DATE IN DATE)
    RETURN VARCHAR2
IS
    V_DATA   VARCHAR2 (50);
BEGIN
    SELECT CASE
               --跨年
               WHEN     TO_CHAR (V_DATE, 'MM') = 01
                    AND TO_CHAR (V_DATE, 'DD') = 01
                    AND TO_CHAR (V_DATE, 'HH24') < 08
               THEN
                      TO_NUMBER (TO_CHAR (V_DATE, 'YYYY')) - 1
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')) + 11, 2, 0)
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) + 29, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --闰年跨月
               WHEN     TO_CHAR (V_DATE, 'DD') = 01
                    AND TO_CHAR (V_DATE, 'HH24') < 08
                    AND LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')), 2, 0) = 03
                    AND MOD (TO_CHAR (V_DATE, 'YYYY'), 4) = 0
                    AND MOD (TO_CHAR (V_DATE, 'YYYY'), 100) != 0
               THEN
                      TO_NUMBER (TO_CHAR (V_DATE, 'YYYY'))
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')) - 1, 2, 0)
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) + 28, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --平年跨月
               WHEN        TO_CHAR (V_DATE, 'DD') = 01
                       AND TO_CHAR (V_DATE, 'HH24') < 08
                       AND LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')), 2, 0) =
                           03
                       AND MOD (EXTRACT (YEAR FROM V_DATE), 4) <> 0
                    OR (    MOD (EXTRACT (YEAR FROM V_DATE), 100) = 0
                        AND MOD (EXTRACT (YEAR FROM V_DATE), 400) <> 0)
               THEN
                      TO_NUMBER (TO_CHAR (V_DATE, 'YYYY'))
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')) - 1, 2, 0)
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) + 27, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --跨月/31天
               WHEN     TO_CHAR (V_DATE, 'DD') = 01
                    AND TO_CHAR (V_DATE, 'HH24') < 08
                    AND LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')), 2, 0) IN
                            ('02',
                             '04',
                             '06',
                             '09',
                             '11')
               THEN
                      TO_NUMBER (TO_CHAR (V_DATE, 'YYYY'))
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')) - 1, 2, 0)
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) + 30, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --跨月/30天
               WHEN     TO_CHAR (V_DATE, 'DD') = 01
                    AND TO_CHAR (V_DATE, 'HH24') < 08
                    AND LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')), 2, 0) IN
                            ('01',
                             '05',
                             '07',
                             '08',
                             '10',
                             '12')
               THEN
                      TO_NUMBER (TO_CHAR (V_DATE, 'YYYY'))
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'MM')) - 1, 2, 0)
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) + 29, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --跨日
               WHEN TO_CHAR (V_DATE, 'HH24') < 08
               THEN
                      TO_CHAR (V_DATE, 'YYYY-MM')
                   || '-'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'DD')) - 1, 2, 0)
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) + 16, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
               --当日
               ELSE
                      TO_CHAR (V_DATE, 'YYYY-MM-DD')
                   || 'T'
                   || LPAD (TO_NUMBER (TO_CHAR (V_DATE, 'HH24')) - 8, 2, 0)
                   || TO_CHAR (V_DATE, ':MI:SS')
                   || '+08:00'
           END
               timestamp
      INTO V_DATA
      FROM DUAL;

    RETURN V_DATA;
EXCEPTION
    WHEN OTHERS
    THEN
        RETURN NULL;
END;

二、使用步骤

1.跨年日期

sql 复制代码
--代码如下(示例)
SELECT GET_UTC_DATE (
           TO_DATE ('2023-01-01 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2022-12-31T23:55:55+08:00

2.跨月日期(判断 闰年 or 平年、用于计算2月天数,正常大小月)

sql 复制代码
--代码如下(示例)
--跨月日期(判断 闰年 or 平年、用于计算2月天数)
--平年
SELECT GET_UTC_DATE (
           TO_DATE ('2023-03-01 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2023-02-28T23:55:55+08:00

--闰年
SELECT GET_UTC_DATE (
           TO_DATE ('2024-03-01 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2024-02-29T23:55:55+08:00

--大月
SELECT GET_UTC_DATE (
           TO_DATE ('2023-04-01 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2023-03-31T23:55:55+08:00

--小月
SELECT GET_UTC_DATE (
           TO_DATE ('2023-05-01 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2023-04-30T23:55:55+08:00

3.跨日日期

sql 复制代码
SELECT GET_UTC_DATE (
           TO_DATE ('2023-04-02 07:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2023-04-01T23:55:55+08:00

3.正常日期

sql 复制代码
SELECT GET_UTC_DATE (
           TO_DATE ('2023-04-02 09:55:55', 'YYYY-MM-DD HH24:MI:SS'))
  FROM DUAL;

--  out: 2023-04-02T01:55:55+08:00

总结

这篇文章到这就结束了,感受您的观看,真诚的致谢!!

相关推荐
这个DBA有点耶8 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶10 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技11 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend12 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence15 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql