【问题标题】:null values not processed by to_timestamp in oracle sqloracle sql中的to_timestamp未处理空值
【发布时间】:2020-03-01 21:13:34
【问题描述】:

我正在尝试使用 sql-loader 从 csv 加载数据。有一列带有这种格式的日期:

2011-12-31 00:00:00.000

我使用 to_date() 进行了尝试,但它无法处理几分之一秒。因此我使用了这个:

cast(TO_TIMESTAMP(:DATUM_ONTVANGST,      'YYYY-MM-DD HH24:MI:SS.FF3')as date)

现在我得到了错误:

ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0

对于列中的空值

to_timestamp 不能处理空值还是我做错了什么?

【问题讨论】:

  • 它在传入NULL 时返回NULL——大多数函数也是如此。你有不同的问题。

标签: sql oracle to-timestamp


【解决方案1】:

这行得通:

select
cast(TO_TIMESTAMP('2011-12-31 00:00:00.000',      'YYYY-MM-DD HH24:MI:SS.FF3')as date)
from dual

这也有效

select
cast(TO_TIMESTAMP(null,      'YYYY-MM-DD HH24:MI:SS.FF3')as date)
from dual

所以一定有一些格式不对的值

【讨论】:

    【解决方案2】:

    我认为您的数据中有space(<field>, ,<field>) 导致了问题。

    在使用它们之前最好使用TRIM

    以下是一些使用不同值进行演示的示例:

    -- working fine with correct timestamp values
    SQL> SELECT
      2      CAST(TO_TIMESTAMP('2019-11-05 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
      3  FROM
      4      DUAL;
    
    DT
    ---------
    05-NOV-19
    
    -- working fine with a null value
    SQL>
    SQL> SELECT
      2      CAST(TO_TIMESTAMP(NULL, 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
      3  FROM
      4      DUAL;
    
    DT
    ---------
    
    
    
    -- working fine with an empty value
    SQL>
    SQL> SELECT
      2      CAST(TO_TIMESTAMP('', 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
      3  FROM
      4      DUAL;
    
    DT
    ---------
    

    现在显示错误和解决方案

    -- giving an error with space in the value -- Your case 
    -- might be you are considering it as the null 
    -- but it is actually a value that is a space character
    SQL>
    SQL> SELECT
      2      CAST(TO_TIMESTAMP(' ', 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
      3  FROM
      4      DUAL;
        CAST(TO_TIMESTAMP(' ', 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
                          *
    ERROR at line 2:
    ORA-01841: (full) year must be between -4713 and +9999, and not be 0
    
    
    -- Solution to your issue -- using TRIM
    SQL>
    SQL> SELECT
      2      CAST(TO_TIMESTAMP(TRIM(' '), 'YYYY-MM-DD HH24:MI:SS.FF3') AS DATE) as dt
      3  FROM
      4      DUAL;
    
    DT
    ---------
    
    
    SQL>
    

    干杯!!

    【讨论】:

      【解决方案3】:

      根据 Ersin 的回答,这是适合我的格式

      select
      cast(NULL AS TIMESTAMP WITH LOCAL TIME ZONE) as date
      from dual
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2018-04-22
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多