代码之家  ›  专栏  ›  技术社区  ›  ima.technophyle

Oracle:将日期时间转换为历元时出错

  •  0
  • ima.technophyle  · 技术社区  · 4 年前

    在尝试将datetime转换为epoch时,我遇到了一个错误: ORA-01810:格式代码出现两次

    QracleSQL查询:

    select (trunc(TO_TIMESTAMP('2022-05-08T19:09:17Z', 'yyyy-MM-dd"T"HH:mm:ssXXX')) - TO_DATE('01/01/1970', 'MM/DD/YYYY')) * 24 * 60 * 60 from dual;
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   Littlefoot    4 年前

    格式掩码不正确。

    SQL> select trunc(cast (to_timestamp('2022-05-08T19:09:17Z', 'yyyy-MM-dd"T"HH24:mi:ss"Z"') as date)
      2        - to_date('01/01/1970', 'mm/dd/yyyy')) *24 *60 *60 res
      3  from dual;
    
           RES
    ----------
    1651968000
    
    SQL>
    
        2
  •  1
  •   mathguy    4 年前

    比如:

    测试数据

    create table sample_inputs (ts_string) as
      select '2022-05-08T16:49:34Z'     from dual union all
      select '2022-04-15T04:20:13.525Z' from dual
    ;
    

    查询和输出

    with
      prep (ts_string, ts) as (
        select ts_string,
               to_timestamp(ts_string, 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"')
        from   sample_inputs
      )
    select ts_string,
           round((trunc(ts, 'mi') - date '1970-01-01') * 24 * 3600)
             + extract(second from ts)
           as epoch
    from   prep;
    
    TS_STRING                        EPOCH
    -------------------------- -----------
    2022-05-08T16:49:34Z        1652028574
    2022-04-15T04:20:13.525Z    1649996413.525
    

    注释

    在你的尝试中有几个错误。Oracle分数秒元素是 ff xxx .您缺少结尾处硬编码Z的占位符(您的掩码中有“T”,这是正确的,但缺少类似的“ZZ”)。 HH 是不够的——必须是 HH24 然后 AM (或同等地) PM )最后。在你的例子中,很明显 HH24 MM mm 在Oracle中也有同样的含义——这不是Unix。分钟的元素是 mi 或者相当于 MI .

    我写的查询保留了纪元中的小数秒。今天早些时候的另一个问题(可能也是你的问题,在另一个用户名下)以“重复”结束,但声称的“重复”与保留小数秒无关,因为输入是Oracle时间戳与Oracle日期(总是有时间成分,但仅以整秒为单位)。