正则表达式输出数据的日期转换 - ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0

时间:2017-12-14 02:21:34

标签: oracle date timestamp date-conversion

我正在尝试将值转换为普通日期格式。但是我收到错误ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0。我已经在本网站上研究了类似问题的答案,但这并没有解决我的问题。

-- How the data looks like 
select REPLACE(REGEXP_SUBSTR(data_detail, '([^|]*)([$|]|$)', 1, 5), '|', '') from land.LAND_DATA;

输出

2017-11-16T04:45:05.000Z

2017-11-16T04:46:04.000Z

当我尝试将上述输出转换为适当的日期格式时,我收到错误。我在这做什么错误

select
TO_DATE(
TO_CHAR(
TO_TIMESTAMP(
     REPLACE(REGEXP_SUBSTR(data_detail, '([^|]*)([$|]|$)', 1, 5), '|', ''), 
'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"'),'MM/DD/YYYY HH24:MI:SS'),
        'MM/DD/YYYY HH24:MI:SS')
from land.LAND_DATA;

1 个答案:

答案 0 :(得分:0)

这些结果是TO_TIMESTAMP function的输入数据:

public class LinkedList {
  public static ArrayList<String> nodes;

  public LinkedList() {
    ArrayList<String> nodes = new ArrayList<String>();
    System.out.print(nodes);
  }

  public ArrayList<String> add(String value) {
    nodes.add(value);
    return nodes;
  }


  public static void main(String [] args) throws IOException
  {
    LinkedList list = new LinkedList();
    list.add("B");
  }

}

首先是一年,然后是一个月和一天,然后是一个时间,最后有一个毫秒(在逗号之后)。

这是代码中的代码段:

2017-11-16T04:45:05.000Z
2017-11-16T04:46:04.000Z

第二个参数是a date format model,这些字母具有以下含义(按顺序):

  • TO_TIMESTAMP( ....... , 'MM/DD/YYYY HH24:MI:SS' ) - 月(01-12; 1月= 01)。
  • MM - 分隔符
  • / - 月份日期(1-31)
  • DD - 分隔符
  • / - 4位数年份; S前缀BC的日期带有减号。
  • YYYY - 分隔符(空格)
  • - 一天中的小时(0-23)。
  • HH24 - 分隔符
  • : - 分钟(0-59)。
  • MI - 分隔符
  • : - 秒(0-59)。

上述格式模型与输入数据的格式不匹配,因为这个格式的月份是第一个,但是您的数据以一年开始!!!

使用以下格式

SS

您可以使用如下的简单查询来测试格式是否正常或出错:

'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"'