【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 函数提取微秒、毫秒、秒和分钟数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值