ORA-01843 - недействительный месяц - работает только с несколькими форматами даты - PullRequest
0 голосов
/ 20 апреля 2020

Использование Toad для Oracle.

Моя исходная таблица содержит даты в формате следующего 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;

Эти даты у меня есть в другой тестовой таблице, где тип date_column VARCHAR:

date_column
2020-07-01
2020-08-01
2020-09-01

Мне нужно преобразовать эти даты в формат ГГГГМ (т. Е. 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, что я явно не хочу. Если я выберу аналогичный формат даты из двойного, он также отлично работает (код ниже дает `202004``):

select to_char(cast(sysdate as date),'YYYYMM') from dual;
---> 202004

РЕДАКТИРОВАТЬ 23.4.2020 Я думаю, что я понял это, хотя должен был понял это намного раньше ... Я должен сначала выбрать SUBSTRING из VARCHAR "date", чтобы он соответствовал формату даты, в который я хочу преобразовать его. Итак,

SELECT ((SUBSTR(date_column, 9, 2)  || SUBSTR(date_column, 6,2)  || SUBSTR(date_column, 1,4))) FROM test_table;

- команда SUBSTRING для выбора даты в формате DDMMYYYY. И следующая команда

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;

- это команда для ее преобразования в дату.

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Если тип данных столбца TIMESTAMP , попробуйте это!

SELECT to_char(date_column, 'YYYYMM') FROM table_name

Если тип данных varchar, попробуйте это,

SELECT TO_CHAR(CAST(column_name as TIMESTAMP), 'YYYYMM') FROM table_name
1 голос
/ 20 апреля 2020

Если это строки и вам нужна строка, как насчет:

select substr(date, 1, 4) || substr(date, 6, 2) as yyyymm

Вы можете использовать это в обеих таблицах.

Если вы хотите сопоставить даты в оригинале стол к другому, затем используйте:

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
1 голос
/ 20 апреля 2020

Я написал простой код, который извлекает месяц и год из вашего столбца:

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;
...