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

总结

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

相关推荐
从零开始学习人工智能21 分钟前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构
LiRuiJie1 小时前
深入剖析MySQL锁机制,多事务并发场景锁竞争
数据库·mysql
2501_915374351 小时前
Faiss向量数据库全面解析:从原理到实战
数据库·faiss
睡觉待开机1 小时前
0. MySQL在Centos 7环境安装
数据库·mysql·centos
2501_915374351 小时前
Faiss vs Milvus 深度对比:向量数据库技术选型指南
数据库·milvus·faiss
傻啦嘿哟2 小时前
Python 数据分析与可视化实战:从数据清洗到图表呈现
大数据·数据库·人工智能
cookqq2 小时前
mongodb源码分析session异步接受asyncSourceMessage()客户端流变Message对象
数据库·sql·mongodb·nosql
呼拉拉呼拉3 小时前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超3 小时前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
pp-周子晗(努力赶上课程进度版)3 小时前
【MySQL】视图、用户管理、MySQL使用C\C++连接
数据库·mysql