【问题标题】:ORA-01830 while inserting date from one table into anotherORA-01830 将日期从一个表插入另一个表
【发布时间】:2019-09-11 10:35:14
【问题描述】:

我有两个表,我想将表一的记录插入表二。

下面是我的代码:

INSERT INTO TBL_IPCOLO_BILLING_MST
(
    CMP, SAP_ID, ID_OD_COUNTCHANGE, ID_OD_CHANGEDDATE, RRH_COUNTCHANGE, RRH_CHANGEDDATE, TENANCY_COUNTCHANGE,
    TENANCY_CHANGEDDATE, RFS_DATE,RFE1_DATE,INFRA_PROVIDER,IP_COLO_SITEID,SITE_NAME,R4GSTATE,MW_INSTALLED,        
    DG_NONDG,EB_NONEB,TOWER_TYPE,VENDOR_CODE, RFCDATE,POLITICAL_STATE_NAME,POLITICAL_STATE_CODE,SITE_DROP_DATE,
    CITY_NAME, NEID,FACILITY_LATITUDE,FACILITY_LONGITUDE,RJ_STRUCTURE_TYPE,RJ_JC_NAME, RJ_JC_CODE )

SELECT
CMP,
SAP_ID,
ID_OD_COUNTCHANGE,
ID_OD_CHANGEDDATE,      
RRH_COUNTCHANGE ,       
RRH_CHANGEDDATE  ,      
TENANCY_COUNTCHANGE ,   
TENANCY_CHANGEDDATE ,  
RFS_DATE_BAND ,         
RFE1_DATE_BAND ,       
INFRA_PROVIDER ,        
IP_COLO_SITEID ,        
SITE_NAME ,             
R4GSTATE   ,            
MW_INSTALLED ,          
DG_NONDG      ,         
EB_NONEB       ,        
TOWER_TYPE      ,       
VENDOR_CODE       , 
SITE_RFCDATE,
NULL,
NULL,
SYSDATE ,
CITY_NAME              ,
NEID                   ,
FACILITY_LATITUDE      ,
FACILITY_LONGITUDE     ,
RJ_STRUCTURE_TYPE      ,
RJ_JC_NAME             ,
RJ_JC_CODE             

FROM tbl_ipcolo_mast_info;

我收到错误:

ORA-01830: 日期格式图片在转换整个输入字符串之前结束

这两个表的数据类型如下所述。

表 1:TBL_IPCOLO_BILLING_MST

CMP                           NVARCHAR2(100) 
SAP_ID                        NVARCHAR2(100) 
ID_OD_COUNTCHANGE             NVARCHAR2(100) 
ID_OD_CHANGEDDATE             DATE           
RRH_COUNTCHANGE               NVARCHAR2(100) 
RRH_CHANGEDDATE               DATE           
TENANCY_COUNTCHANGE           NVARCHAR2(100) 
TENANCY_CHANGEDDATE           DATE           
RFS_DATE                      DATE           
RFE1_DATE                     DATE           
INFRA_PROVIDER                NVARCHAR2(100) 
IP_COLO_SITEID                NVARCHAR2(100) 
SITE_NAME                     NVARCHAR2(500) 
R4GSTATE                      NVARCHAR2(100) 
MW_INSTALLED                  NVARCHAR2(100) 
DG_NONDG                      NVARCHAR2(100) 
EB_NONEB                      NVARCHAR2(100) 
TOWER_TYPE                    NVARCHAR2(100) 
VENDOR_CODE                   NVARCHAR2(100) 
RFCDATE                       DATE           
POLITICAL_STATE_NAME          NVARCHAR2(100) 
POLITICAL_STATE_CODE          NVARCHAR2(100) 
SITE_DROP_DATE                DATE           
CITY_NAME                     NVARCHAR2(100) 
NEID                          NVARCHAR2(100) 
FACILITY_LATITUDE             NVARCHAR2(100) 
FACILITY_LONGITUDE            NVARCHAR2(100) 
RJ_STRUCTURE_TYPE             NVARCHAR2(100) 
RJ_JC_NAME                    NVARCHAR2(100) 
RJ_JC_CODE                    NVARCHAR2(100) 
COMPANY_CODE                  NVARCHAR2(100) 

表 2:tbl_ipcolo_mast_info

CMP                          NVARCHAR2(100)  
SAP_ID                       NVARCHAR2(50)   
ID_OD_COUNTCHANGE            NVARCHAR2(20)   
ID_OD_CHANGEDDATE            NVARCHAR2(100)  
RRH_COUNTCHANGE              NVARCHAR2(50)   
RRH_CHANGEDDATE              NVARCHAR2(20)   
TENANCY_COUNTCHANGE          NVARCHAR2(50)   
TENANCY_CHANGEDDATE          NVARCHAR2(100)  
CREATED_BY                   NVARCHAR2(55)   
CREATED_DATE                 DATE            
UMS_GRP_BY_ID                NUMBER          
UMS_GRP_BY_NAME              NVARCHAR2(55)   
UMS_GRP_TO_ID                NUMBER          
UMS_GRP_TO_NAME              NVARCHAR2(55)   
CMM_STATUS                   CHAR(1)         
FCA_STATUS                   CHAR(1)         
LAST_UPDATED_BY              NVARCHAR2(55)   
LAST_UPDATED_DATE            DATE            
RFS_DATE_BAND                NVARCHAR2(100)  
RFE1_DATE_BAND               NVARCHAR2(100)  
SF_SITERRHDATE               NVARCHAR2(100)  
SF_RRHCOUNT                  NVARCHAR2(100)  
INFRA_PROVIDER               NVARCHAR2(250)  
IP_COLO_SITEID               NVARCHAR2(200)  
SITE_NAME                    NVARCHAR2(500)  
R4GSTATE                     NVARCHAR2(100)  
MW_INSTALLED                 NVARCHAR2(100)  
DG_NONDG                     NVARCHAR2(50)   
EB_NONEB                     NVARCHAR2(20)   
TOWER_TYPE                   NVARCHAR2(100)  
SITE_ADDRESS                 NVARCHAR2(1000) 
VENDOR_CODE                  NVARCHAR2(100)  
SITE_RFCDATE                 NVARCHAR2(100)  
CITY_NAME                    NVARCHAR2(100)  
NEID                         NVARCHAR2(55)   
FACILITY_LATITUDE            NVARCHAR2(100)  
FACILITY_LONGITUDE           NVARCHAR2(100)  
RJ_STRUCTURE_TYPE            NVARCHAR2(100)  
RJ_JC_NAME                   NVARCHAR2(100)  
RJ_JC_CODE                   NVARCHAR2(100)  
COMPANY_CODE                 VARCHAR2(55)    

请提出这里有什么问题。

【问题讨论】:

  • 我们对您的表或数据一无所知。但是该错误意味着您正在尝试将源表中的字符串值隐式转换为目标表中的日期值。两个表中的数据类型不同,在这种情况下,您应该进行显式转换并提供正确的格式模型(尽管您当然不应该将日期作为字符串放在首位),或者您在源和目标表列列表,但似乎并非如此。 rfs_date_bandrfe1_date_band 实际上是约会吗?那些看起来最可疑的......
  • @AlexPoole:先生,我猜数据类型是问题所在。我已经更新了两个表的数据类型信息。请看看,让我知道。是的,它们是日期列,之前它被错误地用 nvarchar 进行数据类型化。现在我将它与正确的数据类型正确对齐
  • @AlexPoole:我已经更新了我拥有数据格式的问题。主要是dd-MM-yyyy 格式。所以请建议我如何继续前进
  • 尝试逐列插入数据,这样就可以查看是哪一列出了问题。
  • @hakobot:问题出在日期列中.. 但是如何正确设置它以便插入是我想要解决的问题

标签: sql oracle date


【解决方案1】:

由于某种原因,您的源数据将日期值存储为 nvarchar2(100) 列中的字符串。 Oracle 正在尝试使用会话的 NLS 设置隐式转换值,但无法 - 因此出现您看到的错误。

您应该将字符串显式转换为日期,对存储在每列中的数据使用正确的格式模型:

INSERT INTO TBL_IPCOLO_BILLING_MST
(
...)
SELECT
CMP,
SAP_ID,
ID_OD_COUNTCHANGE,
to_date(ID_OD_CHANGEDDATE, 'FXDD-MM-YYYY'),     
...

等等。但它比这更复杂,因为您的图像显示了'-'ID_OD_CHANGEDDATE,它可能应该代表没有值(所以可能真的应该是 null 吗?)。这不能转换为日期,因此您可以使用 case 表达式来避免它:

...
ID_OD_COUNTCHANGE,
case when ID_OD_CHANGEDDATE != '-' then to_date(ID_OD_CHANGEDDATE, 'FXDD-MM-YYYY') end,     
...

当然,这假定这是该列中唯一不可转换的值。由于它是一个字符串列,它可以包含任何内容 - 这是使用正确数据类型的主要原因,正如您现在正在尝试做的那样。

如果您使用的是 Oracle 12cR2 或更高版本,您可以将所有不可转换的值默认设置为 null:

...
ID_OD_COUNTCHANGE,
to_date(ID_OD_CHANGEDDATE default null on conversion error, 'FXDD-MM-YYYY'),     
...

然后,您无需指定要忽略的破折号或该列中的任何其他非日期类值。但它也会忽略您可能认为应该是日期但格式不同的东西。我在格式掩码中包含了 FX 修饰符,因此它不会错误地转换两位数的年份值,但这只是意味着它们现在将被忽略,并在目标表中也设置为 null。

您还说过“通常是 dd-MM-yyyy 格式”;希望这意味着不同的源列始终采用不同的格式,并且您只需要为每列使用不同的模型。如果一列可以具有多种格式的值,那么您可能需要考虑在开始之前清理这些值。有多种方法可以尝试多种格式模型,直到其中一个转换成功,但这种方法并不理想。


从聊天中的进一步讨论中发现,某些值是 DD-Mon-RR,在同一列中混合使用。我以this function 为例说明如何使用多种格式之一进行转换;但由于这里需要忽略任何无法转换的内容,因此将其调整为:

create or replace function clean_date
    ( p_date_str in varchar2)
    return date
is
    l_dt_fmt_nt sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll
        ('DD-Mon-RR', 'DD-MM-YYYY');
    return_value date;
begin
    for idx in l_dt_fmt_nt.first()..l_dt_fmt_nt.last()
    loop
        begin
            return_value := to_date(p_date_str, l_dt_fmt_nt(idx));
            exit;
        exception
             when others then null;
        end;
    end loop;
    return return_value;
end clean_date;
/

... 被调用而不是 to_date(),即作为 clean_date(ID_OD_COUNTCHANGE),并且不需要 case 表达式包装器。 (我还强调,应该彻底调查数据,因为可能存在其他日期格式的值可以挽救,这个化身将设置为空。)

【讨论】:

  • 所以我应该像这样使用 'FXDD-MM-YYYY 吗??
  • 如果源列中的字符串值采用该格式,则可以。您在图像中显示的值就是这样。如果某些列具有不同格式的字符串值,那么它们将需要不同的模型来转换它们。
  • 得到Error at Command Line : 4 Column : 12 Error report - SQL Error: ORA-00917: missing comma 00917. 00000 - "missing comma"这里是代码INSERT INTO TBL_IPCOLO_BILLING_MST ( CMP, SAP_ID, ID_OD_COUNTCHANGE, TO_DATE(ID_OD_CHANGEDDATE, 'FXDD-MM-YYYY'), RRH_COUNTCHANGE, TO_DATE(RRH_CHANGEDDATE, 'FXDD-MM-YYYY'),....
  • to_date() 函数调用进入 SELECT 部分,而不是 INSERT INTO (...) 部分的列列表。 (您似乎也忽略了有关处理图像中显示的 '-' 值的信息,但这不是导致 ORA-00917 的原因...)
  • 哦,是的,已解决,但现在出现错误为ORA-01862: the numeric value does not match the length of the format item
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多