首页 > 解决方案 > 如何在 Oracle 的 SQL 中将数字 (YYMMDDhhmmss) 转换为时间戳?

问题描述

我正在尝试计算systimestampOracle 的 SQL 中的一个数字之间的差异。

数字格式为YYMMDDhhmmss(例如190903210000)。此数字保存在表格中,并且基于 24 小时时区。

我正在尝试以秒为单位计算该数字和系统时间戳的差异。

我必须使用如下选择语句:

SELECT X FROM table

然后我需要计算一个差异(SYSTEMTIMESTAMP - X)

我的系统时间戳格式如下03-SEP-19 06.21.49.817757 PM +00:00

你能告诉我正确的方法吗?

标签: sqloracledatetype-conversionnumbers

解决方案


要将 a 转换NUMBER为 a,TIMESTAMP您可以使用类似 的表达式TO_TIMESTAMP(TO_CHAR(...))。要计算两个时间戳之间的秒数,一种解决方案是将两者都转换为日期,然后减去它们:您将以天为单位获得(十进制)结果,然后可以将其转换为秒。

考虑:

( 
    CAST(systimestamp AS DATE)
    - CAST(TO_TIMESTAMP(TO_CHAR(190903210000), 'YYMMDDhh24miss') AS DATE)
) * 60 * 60 * 24

但是,由于时间戳的数字表示不包含小数秒(也不包含时区),因此直接转换为 a 可能会更简单DATE,这将消除CAST之后对它的需要,因此:

(
    CAST(systimestamp AS DATE) 
    - TO_DATE(TO_CHAR(190903210000), 'YYMMDDhh24miss')
) * 60 * 60 * 24

DB Fiddle 上的演示

SELECT 
    systimestamp,
    190903210000 num,
    TO_TIMESTAMP(TO_CHAR(190903210000), 'YYMMDDhh24miss') num_as_timestamp,
    (
        CAST(systimestamp AS DATE) -
        CAST(TO_TIMESTAMP(TO_CHAR(190903210000), 'YYMMDDhh24miss') AS DATE)
    ) * 60 * 60 * 24 diff
FROM DUAL;
系统时间戳 | 数字 | NUM_AS_TIMESTAMP | 差异
:------------------------------------------------ | ------------: | :-------------------------------- | ---:
03-SEP-19 09.13.39.989343 下午 +01:00 | 190903210000 | 03-SEP-19 09.00.00.000000000 下午 | 819
SELECT 
    systimestamp,
    190903210000 num,
    TO_DATE(TO_CHAR(190903210000), 'YYMMDDhh24miss') num_as_date,
    (
        CAST(systimestamp AS DATE) 
        - TO_DATE(TO_CHAR(190903210000), 'YYMMDDhh24miss')
    ) * 60 * 60 * 24 diff
FROM DUAL;
系统时间戳 | 数字 | NUM_AS_DATE | 差异
:------------------------------------------------ | ------------: | :----------------- | ----------------------------------------------------:
03-SEP-19 09.20.44.524445 下午 +01:00 | 190903210000 | 03-SEP-19 21:00:00 | 1243.999999999999999999999999999999999996

推荐阅读