簡體   English   中英

ORA-01843 - 不是一個有效的月份 - 只使用幾種日期格式

[英]ORA-01843 - not a valid month - only working with a few date formats

將蟾蜍用於 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

我需要將這些日期轉換為 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

編輯 23.4.2020 我想我想通了,雖然應該更早地想通了......我必須首先 select 來自 VARCHAR“日期”的 SUBSTRING ,以便它匹配我想要將其轉換為的日期格式。 所以,

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

是 SUBSTRING 命令到 select 日期,格式為 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;

是將其轉換為日期的命令。

我寫了一些簡單的代碼,從您的列中提取月份和年份:

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

您實際上可以在兩張桌子上使用它。

如果要將原始表中的日期與另一個匹配,請使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM