ORA-01843 - 月份无效 - 仅适用于几种日期格式
ORA-01843 - not a valid month - only working with a few date formats
使用 Toad for Oracle。
我的初始 table 日期格式如下 2020-07-01T00:00:00
。我正在使用以下代码从每个日期删除从 T
开始的所有内容:
SELECT NVL(SUBSTR(date_column_0, 0, INSTR(date_column_0, 'T')-1), date_column_0) as date_column_0 FROM original_table;
这些日期我在另一个测试中 table,其中 date_column 类型是 VARCHAR:
date_column
2020-07-01
2020-08-01
2020-09-01
我需要将这些日期转换为 YYYYMM 格式(即 202007)。 到目前为止我已经尝试过
1)
select to_char(cast(date_column as date, 'YYYYMM')) from test_table;
select to_char(to_date(date_column, 'YYYYMM')) from test_table
这两个都会产生错误 ORA-01843 - not a valid month
。
2)
select to_char(cast(column_6 as date), 'YYYYMM') from test_table;
select to_char(cast(column_6 as date), 'YYYY/MM/DD') from test_table;
两者都产生错误 ORA-01861: literal does not match format string
。
出于某种原因,
select to_char(cast(date_column as date, 'YYYY/MM/DD')) from test_table;
select to_char(to_date(date_column, 'YYYY/MM/DD')) from test_table
两者都有效并以 01-JUL-20
格式显示日期,这显然是我不想要的。如果我 select 来自 dual 的类似日期格式,它也可以完美地工作(下面的代码产生 `202004``):
select to_char(cast(sysdate as date),'YYYYMM') from dual;
---> 202004
编辑 2020 年 4 月 23 日
我想我已经弄明白了,虽然应该更早地弄清楚... 我必须首先 select 来自 VARCHAR "date" 的 SUBSTRING 以便它匹配我想要的日期格式将其转换为。 所以,
SELECT ((SUBSTR(date_column, 9, 2) || SUBSTR(date_column, 6,2) || SUBSTR(date_column, 1,4))) FROM test_table;
是 select DDMMYYYY 格式日期的 SUBSTRING 命令。以及以下命令
SELECT to_char(cast(SUBSTR(date_column, 9, 2) || SUBSTR(date_column, 6,2) || SUBSTR(date_column, 1,4) as date, 'DD-MM-YYYY')) FROM test_table;
是将其转换为日期的命令。
我写了一些简单的代码来从您的专栏中提取月份和年份:
select lpad(extract(month from to_date('2008-09-01' , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date('2008-09-01' , 'YYYY-MM-DD')),4,'0')
from dual;
如果你想从中创建日期,你可以像这样简单地做:
select to_date(lpad(extract(month from to_date('2008-09-01' , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date('2008-09-01' , 'YYYY-MM-DD')),4,'0')
,'MMYYYY')
from dual;
所以在你的例子中它会是这样的:
select to_date(lpad(extract(month from to_date(date_column , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date(date_column , 'YYYY-MM-DD')),4,'0')
,'MMYYYY')
from test_table;
如果列的数据类型是TIMESTAMP,那么试试这个!
SELECT to_char(date_column, 'YYYYMM') FROM table_name
如果数据类型是 varchar,试试这个,
SELECT TO_CHAR(CAST(column_name as TIMESTAMP), 'YYYYMM') FROM table_name
如果这些是字符串而你想要一个字符串,怎么样:
select substr(date, 1, 4) || substr(date, 6, 2) as yyyymm
您实际上可以在两个 table 上使用它。
如果要将原始 table 中的日期与其他日期匹配,请使用:
select . . .
from original o join
testtable tt
on o.datecol >= to_date(tt.datecol, 'YYYY-MM-DD') and
o.datecol < to_date(tt.datecol, 'YYYY-MM-DD') + interval '1' month
使用 Toad for Oracle。
我的初始 table 日期格式如下 2020-07-01T00:00:00
。我正在使用以下代码从每个日期删除从 T
开始的所有内容:
SELECT NVL(SUBSTR(date_column_0, 0, INSTR(date_column_0, 'T')-1), date_column_0) as date_column_0 FROM original_table;
这些日期我在另一个测试中 table,其中 date_column 类型是 VARCHAR:
date_column
2020-07-01
2020-08-01
2020-09-01
我需要将这些日期转换为 YYYYMM 格式(即 202007)。 到目前为止我已经尝试过
1)
select to_char(cast(date_column as date, 'YYYYMM')) from test_table;
select to_char(to_date(date_column, 'YYYYMM')) from test_table
这两个都会产生错误 ORA-01843 - not a valid month
。
2)
select to_char(cast(column_6 as date), 'YYYYMM') from test_table;
select to_char(cast(column_6 as date), 'YYYY/MM/DD') from test_table;
两者都产生错误 ORA-01861: literal does not match format string
。
出于某种原因,
select to_char(cast(date_column as date, 'YYYY/MM/DD')) from test_table;
select to_char(to_date(date_column, 'YYYY/MM/DD')) from test_table
两者都有效并以 01-JUL-20
格式显示日期,这显然是我不想要的。如果我 select 来自 dual 的类似日期格式,它也可以完美地工作(下面的代码产生 `202004``):
select to_char(cast(sysdate as date),'YYYYMM') from dual;
---> 202004
编辑 2020 年 4 月 23 日 我想我已经弄明白了,虽然应该更早地弄清楚... 我必须首先 select 来自 VARCHAR "date" 的 SUBSTRING 以便它匹配我想要的日期格式将其转换为。 所以,
SELECT ((SUBSTR(date_column, 9, 2) || SUBSTR(date_column, 6,2) || SUBSTR(date_column, 1,4))) FROM test_table;
是 select DDMMYYYY 格式日期的 SUBSTRING 命令。以及以下命令
SELECT to_char(cast(SUBSTR(date_column, 9, 2) || SUBSTR(date_column, 6,2) || SUBSTR(date_column, 1,4) as date, 'DD-MM-YYYY')) FROM test_table;
是将其转换为日期的命令。
我写了一些简单的代码来从您的专栏中提取月份和年份:
select lpad(extract(month from to_date('2008-09-01' , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date('2008-09-01' , 'YYYY-MM-DD')),4,'0')
from dual;
如果你想从中创建日期,你可以像这样简单地做:
select to_date(lpad(extract(month from to_date('2008-09-01' , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date('2008-09-01' , 'YYYY-MM-DD')),4,'0')
,'MMYYYY')
from dual;
所以在你的例子中它会是这样的:
select to_date(lpad(extract(month from to_date(date_column , 'YYYY-MM-DD')),2,'0')
||lpad(extract(year from to_date(date_column , 'YYYY-MM-DD')),4,'0')
,'MMYYYY')
from test_table;
如果列的数据类型是TIMESTAMP,那么试试这个!
SELECT to_char(date_column, 'YYYYMM') FROM table_name
如果数据类型是 varchar,试试这个,
SELECT TO_CHAR(CAST(column_name as TIMESTAMP), 'YYYYMM') FROM table_name
如果这些是字符串而你想要一个字符串,怎么样:
select substr(date, 1, 4) || substr(date, 6, 2) as yyyymm
您实际上可以在两个 table 上使用它。
如果要将原始 table 中的日期与其他日期匹配,请使用:
select . . .
from original o join
testtable tt
on o.datecol >= to_date(tt.datecol, 'YYYY-MM-DD') and
o.datecol < to_date(tt.datecol, 'YYYY-MM-DD') + interval '1' month