欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 【Oracle】TIMESTAMP类型时间计算时间差

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

2025/3/30 17:17:31 来源:https://blog.csdn.net/promise524/article/details/142236556  浏览:    关键词:【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_timeFROM 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_timeFROM dual);

输出结果:

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

总结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词