【问题标题】:Inavlid timestamp Teradata时间戳无效 Teradata
【发布时间】:2020-01-24 20:18:09
【问题描述】:

我的 Ship_Date 为 12/14/2013 20:27,并在源表中定义为 varachar 数据类型。如何将其转换为时间戳格式并按 12/14/2013 20:27 加载?我正在使用CAST (SHIP_DATE AS TIMESTAMP(0) FORMAT 'MM/DD/YYYYHH:MI:SS') AS SHIP_DATE 但 terdata 抛出无效时间戳错误。请帮助解决问题

【问题讨论】:

    标签: teradata


    【解决方案1】:

    您在原来的演员表中缺少B,表示空白/空格。但是 Teradata 在一个个位数的月份上表现不佳。您可以使用正则表达式添加前导零:

    Cast(RegExp_Replace(SHIP_DATE,'\b([\d])\b', '0\1') AS TIMESTAMP(0) FORMAT'dd/mm/yyyyBhh:mi')
    

    【讨论】:

    • 很好,我什至没有注意到 dang B 不见了。
    【解决方案2】:

    select to_timestamp('12/14/2013 20:27','MM/DD/YYYY HH24:MI');

    【讨论】:

    • sel to_timestamp(SHIP_DATE ,'MM/DD/YYYY HH24:MI') FROM TABLE1 ..我试过这种方式,但一年中的错误月份必须是两位数。
    • 您需要为具有月份 1..9 的 SHIP_DATE 值添加一个前导零
    • 我一直想知道为什么DD 可以处理一位数的日期,而MM 不能处理一位数的月份。
    • TO_TIMESTAMP 有一个愚蠢的问题,它总是返回一个 TIMESTAMP(6)
    【解决方案3】:

    你写的演员表的问题是你告诉 Teradata 你的字符串中有几秒钟,而你没有。您可以使用:

    select cast ('12/14/2014 20:27' as TIMESTAMP(0) FORMAT 'MM/DD/YYYYBHH:MI') 
    

    但是,这仍然无法处理个位数的月份。

    【讨论】:

      【解决方案4】:

      这里的问题是 2013 和 20 之间的空白区域以及秒数的缺失零。 我确实 oreplace 删除了空格和串联,它起作用了。

      SELECT
      CAST (
      ( OREPLACE('12/14/2013 20:27', ' ','') ||':00')
      AS TIMESTAMP(0) FORMAT 'MM/DD/YYYYHH:MI:SS'
      ) AS SHIP_DATE
      

      结果如下:

      【讨论】:

      • 直接应用匹配的FORMAT 'MM/DD/YYYYbHH:MI' 要简单得多:-) 当然,这在个位数的月/日也会失败。
      猜你喜欢
      • 2023-03-22
      • 2019-02-22
      • 2020-01-25
      • 2022-07-20
      • 2017-01-21
      • 2014-04-25
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多