【问题标题】:How to convert a number (YYMMDDhhmmss) into timestamp in Oracle's SQL?如何在 Oracle SQL 中将数字 (YYYYMMDDhhmmss) 转换为时间戳?
【发布时间】:2020-01-06 16:06:32
【问题描述】:

我正在尝试计算systimestamp 与 Oracle 的 SQL 中的数字之间的差异。

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

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

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

SELECT X FROM table

那我需要计算一个差值(SYSTEMTIMESTAMP - X)

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

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

【问题讨论】:

  • 你试过to_timestamp()吗?
  • 感谢您的回复。我想补充一点。我的问题中解释的 x 不是静态值。我在表格中取这个值。它改变每一次运行。所以,我不能在选择语句中使用 TO_TIMESTAMP(TO_CHAR(...)) 。首先,我需要从表中获取 X,然后我需要转换,最后与时间戳有所不同。如何在 select 语句中将数字转换为时间戳?

标签: sql oracle date type-conversion numbers


【解决方案1】:

试试这个:

select 190903210000 n,
       to_timestamp(to_char(190903210000), 'YYMMDDHH24MISS') ts
from dual;

SQLFiddleOracle documentation 中。

【讨论】:

    【解决方案2】:

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

    考虑:

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

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

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

    Demo on 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

    【讨论】:

    • 感谢您的回复。我想补充一点。我的问题中解释的 x 不是静态值。我在表格中取这个值。它改变每一次运行。所以,我不能在选择语句中使用 TO_TIMESTAMP(TO_CHAR(...)) 。首先,我需要从表中获取 X,然后我需要转换,最后与时间戳有所不同。如何在 select 语句中将数字转换为时间戳?
    • @OnurSürmeli:不用担心,这在从表中获取数据时同样有效。基本上,您只需要将单词DUAL 替换为您的表名,并将190903210000 替换为包含该数字的列的名称。请参阅this db fiddle 以供参考。
    • 您好,首先非常感谢您。它正在工作,我正在我的过程中使用。但是当表中 X 的计数很多时,我需要一个新的查询。如果 X 的计数只是 1,那没关系,但 x 的计数不只是 1,Oracle 说“你不能从一个值 (CAST(systimestamp AS DATE)) 中减去许多 X。描述“一个值”的东西是“systemtimestamp”我怎样才能进步?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2013-10-30
    • 2014-06-01
    • 2016-09-30
    • 1970-01-01
    • 2015-02-01
    • 2021-06-21
    相关资源
    最近更新 更多