当前位置: 首页 > article >正文

【Oracle】TIMESTAMP类型时间计算时间差

在 Oracle 中,TIMESTAMPTIMESTAMP(6) 的主要区别在于时间精度。TIMESTAMP 默认不包含微秒,而 TIMESTAMP(6) 支持微秒精度(6 位小数秒)。详细说明两者的区别、相互转换,并深入讨论如何计算两个 TIMESTAMP(6) 之间的时间差,包括微秒、毫秒、秒、分钟的计算。

1. TIMESTAMPTIMESTAMP(6) 的区别

  • TIMESTAMP:表示日期和时间,没有微秒部分。默认格式是 YYYY-MM-DD HH24:MI:SS

  • TIMESTAMP(6):支持微秒的时间戳类型,可以保存到 6 位小数秒,格式为 YYYY-MM-DD HH24:MI:SS.FFFFFF,其中 FFFFF 表示小数秒部分。

2. 相互转换

Oracle 提供了灵活的转换方式来处理 TIMESTAMPTIMESTAMP(6) 之间的转换。通过使用 CAST 函数,可以将它们进行互相转换。

  • TIMESTAMP(6) 转换为 TIMESTAMP(忽略微秒部分)

    SELECT CAST(timestamp6_col AS TIMESTAMP) FROM your_table;
    
  • TIMESTAMP 转换为 TIMESTAMP(6)(补充小数秒为 000000):

    SELECT CAST(timestamp_col AS TIMESTAMP(6)) FROM your_table;
    

3. 计算两个 TIMESTAMP(6) 类型的时间差

Oracle 中两个 TIMESTAMP(6) 类型的相减会返回一个 INTERVAL DAY TO SECOND 类型,表示时间差,包括天数、小时、分钟、秒以及小数秒。

假设有两个 TIMESTAMP(6) 的时间:

SELECT TO_TIMESTAMP('2024-09-13 10:30:15.123456', 'YYYY-MM-DD HH24:MI:SS.FF6') AS start_time,
       TO_TIMESTAMP('2024-09-13 12:45:35.654321', 'YYYY-MM-DD HH24:MI:SS.FF6') AS end_time
FROM dual;

要计算 start_timeend_time 的时间差,可以使用:

SELECT (end_time - start_time) AS time_diff
FROM (SELECT TO_TIMESTAMP('2024-09-13 10:30:15.123456', 'YYYY-MM-DD HH24:MI:SS.FF6') AS start_time,
             TO_TIMESTAMP('2024-09-13 12:45:35.654321', 'YYYY-MM-DD HH24:MI:SS.FF6') AS end_time
      FROM dual);

结果是一个 INTERVAL,类似于:

+00 02:15:20.530865

表示时间差为 2 小时 15 分 20 秒 530865 微秒。

4. 提取微秒、毫秒、秒、分钟数

提取微秒数

使用 EXTRACT 函数从 INTERVAL 中提取秒部分的微秒:

SELECT EXTRACT(SECOND FROM (end_time - start_time)) AS seconds_with_fraction,
       TO_NUMBER(TO_CHAR((end_time - start_time), 'FF6')) AS microseconds
FROM your_table;

EXTRACT(SECOND) 提取秒数和小数秒,而 TO_NUMBER(TO_CHAR(..., 'FF6')) 提取出微秒部分。

提取毫秒数

通过将微秒除以 1000 可以得到毫秒:

SELECT (TO_NUMBER(TO_CHAR((end_time - start_time), 'FF6')) / 1000) AS milliseconds
FROM your_table;
提取总秒数

将天、小时、分钟和秒数转换为总秒数:

SELECT EXTRACT(DAY FROM (end_time - start_time)) * 86400 +  -- 天数转秒
       EXTRACT(HOUR FROM (end_time - start_time)) * 3600 +  -- 小时转秒
       EXTRACT(MINUTE FROM (end_time - start_time)) * 60 +  -- 分钟转秒
       EXTRACT(SECOND FROM (end_time - start_time)) AS total_seconds
FROM your_table;
提取分钟数

将时间差转换为分钟(包括完整分钟和部分秒数):

SELECT EXTRACT(DAY FROM (end_time - start_time)) * 1440 +  -- 天数转分钟
       EXTRACT(HOUR FROM (end_time - start_time)) * 60 +   -- 小时转分钟
       EXTRACT(MINUTE FROM (end_time - start_time)) AS total_minutes
FROM your_table;

假设有以下两个时间戳:

SELECT TO_TIMESTAMP('2024-09-13 10:30:15.123456', 'YYYY-MM-DD HH24:MI:SS.FF6') AS start_time,
       TO_TIMESTAMP('2024-09-13 12:45:35.654321', 'YYYY-MM-DD HH24:MI:SS.FF6') AS end_time
FROM dual;

要计算这两个时间戳的微秒、毫秒、秒、分钟差,可以使用以下查询:

SELECT EXTRACT(DAY FROM (end_time - start_time)) * 86400 +  -- 天数转秒
       EXTRACT(HOUR FROM (end_time - start_time)) * 3600 +  -- 小时转秒
       EXTRACT(MINUTE FROM (end_time - start_time)) * 60 +  -- 分钟转秒
       FLOOR(EXTRACT(SECOND FROM (end_time - start_time))) AS total_seconds,

       EXTRACT(DAY FROM (end_time - start_time)) * 1440 +   -- 天数转分钟
       EXTRACT(HOUR FROM (end_time - start_time)) * 60 +    -- 小时转分钟
       EXTRACT(MINUTE FROM (end_time - start_time)) AS total_minutes,

       TO_NUMBER(TO_CHAR((end_time - start_time), 'FF6')) AS microseconds,
       TO_NUMBER(TO_CHAR((end_time - start_time), 'FF6')) / 1000 AS milliseconds
FROM (SELECT TO_TIMESTAMP('2024-09-13 10:30:15.123456', 'YYYY-MM-DD HH24:MI:SS.FF6') AS start_time,
             TO_TIMESTAMP('2024-09-13 12:45:35.654321', 'YYYY-MM-DD HH24:MI:SS.FF6') AS end_time
      FROM dual);

输出结果:

  • 秒数:将得到两个时间戳之间的总秒数。
  • 分钟数:返回的是总分钟数(不包括小数秒)。
  • 微秒数:返回微秒差异部分。
  • 毫秒数:返回的微秒数除以 1000 得出毫秒差。

总结

  • TIMESTAMPTIMESTAMP(6) 的主要区别是精度,TIMESTAMP(6) 支持微秒级别的精度。
  • 通过 CAST 函数可以实现两者之间的相互转换。
  • 通过直接相减可以计算两个 TIMESTAMP(6) 之间的差值,并使用 EXTRACTTO_CHAR 函数提取微秒、毫秒、秒和分钟数。

http://www.kler.cn/a/305212.html

相关文章:

  • python: postgreSQL using psycopg2 or psycopg
  • Android Framework AMS(16)进程管理
  • 基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统
  • 【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey
  • 平替 Spring 正当时!Solon v3.0.3 发布
  • 自动驾驶3D目标检测综述(一)
  • SprinBoot+Vue宠物共享平台的设计与实现
  • 性能诊断的方法(五):架构和业务诊断
  • 前端下载word、excel文件的两种方法
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • dedecms靶场(四种webshell姿势)
  • JMeter 入门之远程启动,服务模式,多机联测,负载均衡测试
  • 基于python+django+vue+MySQL的酒店推荐系统
  • Golang | Leetcode Golang题解之第396题旋转函数
  • 数据结构C //线性表(链表)ADT结构及相关函数
  • Qt与MQTT交互通信
  • 探索音视频SDK的双重核心:客户端与服务端的协同作用
  • 裸金属服务器与云服务器的区别有哪些?
  • 选择合适的工业制造营销代理机构:应关注哪些方面
  • 【开源免费】基于SpringBoot+Vue.JS高校心理教育辅导系统(JAVA毕业设计)
  • Axios 掌握现代 Web 开发的 HTTP 客户端
  • jenkins入门
  • Leangoo敏捷工具在缺陷跟踪(BUG)管理中的高效应用
  • 网络编程day05(循环服务器、并发服务器)
  • opencv之Canny边缘检测
  • 闭包+面试真题