0

我正在尝试使用 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 不能处理空值还是我做错了什么?

4

3 回答 3

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

所以一定有一些值不是正确的格式

于 2019-11-05T13:28:50.833 回答
0

我认为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>

干杯!!

于 2019-11-05T15:31:22.017 回答
0

基于 Ersin 的回答,这是对我有用的格式

select
cast(NULL AS TIMESTAMP WITH LOCAL TIME ZONE) as date
from dual
于 2021-08-13T19:29:22.347 回答