我在 sql 查询 ORA-01847 中遇到错误:月份中的某一天必须介于 1 和月份最后一天之间

问题描述 投票:0回答:1
 INSERT INTO MANPOWER.VIPBADGE ( 
           DOC_SRL, GRP_CD, DOC_TYPE, REC_TYPE, MV_MT, VESS_NAME, VESS_TYPE, IMO_NO, CALL_SIGN, REG_PORT, 
            AGENCY_FUN_CD, AGENCY_CD, EX_VESS_NAME, EX_CALL_SIGN, VESS_FLAG, SAT_ID, SATCOM_ID, FREE_BOARD, VESS_BLD_DT, VESS_BLD_PLACE,
            DT_OF_DELI, PERMANENT_VALIDTY, SHIP_REG_CERT_NO, SHIP_REG_VALDT, SAFETY_MGMT_CERT_NO, SAFETY_MGMT_CERT_VALDT, VESS_HT, ISPS_COMPL, CAP2_CERT, BEAM, 
           LOA, LBP, MAX_DRAFT, PARL_BODY_LN, BOW_TO_MANIFOLD, GRT, NRT, DWT, SUMMER_DEAD_WT, TEU_CAP, 
            SBT, REDU_GRT, VESS_OWN, EMAIL_ID, CLASSFN_SOCIETY, HULL_INS_COMP_NAME, HULL_INS_COMP_VALDT, ENGN_TYPE, NO_OF_ENGN, ENGN_POWER, 
            PROPULSION_TYPE, NO_OF_PROPELLERS, NO_OF_BAYS, NO_OF_ROWS_ON_DECK, HATCH_COVER_TYPE, NO_OF_HATCH, MAX_MAN_SPEED, BOW_THRUSTER, BOW_THRUSTER_NO, BOW_THRUSTER_POWER, 
           STERN_THRUSTER_NO, STERN_THRUSTER_POWER, BULBOUS_BOW, MMSI_NO, PORT_APPR, APPR_BY, APPR_DT, ACTION_FLAG, ENTRY_BY, ENTRY_DT ) VALUES ( 
           '8735910', 'VRD', 'VESPRO', 'N', 'MT', 'KDS TANKER 1', '153', '170224', '5778568', 'INMAA1', 'VA', '70009330', ' ', ' ', 'IN', ' ',
            ' ', '1', TO_DATE('01/01/2023','dd/MM/yyyy'), ' ', ' ', 'N', '6527849 ',  TO_DATE('31/12/2025', 'dd/MM/yyyy'), '7539234578', 
            TO_DATE('28/12/2025', 'dd/MM/yyyy'), ' ', 'Y', 'N', '30.00', '120.00', '100.00', '10.00', ' 90.000', ' ', '1000.0', ' 
            500.0', '1500.0', ' ', ' ', 'N', ' ', 'RAM ', ' ', ' ', ' ', '', 'DIESEL', '2', ' ', 'DIESEL', '2', ' ', ' ', ' ', '1', '14.0', 'Y', '2', 
           ' ', '2', ' ', 'N', ' ', 'INKKK1', ' admin001',TO_DATE('17/02/2025', 'dd/MM/yyyy'), 'Y', ' ADMIN',SYSDATE )

我已经以正确的格式提供了所有日期,但仍然出现错误:

ORA-01847: day of month must be between 1 and last day of month
请解释为什么?

javascript java sql database oracle
1个回答
0
投票

谁知道呢;您还应该发布表格 description,其中指定哪些列是

DATE

查看该查询,看起来“dt”代表“日期”。如果是这样,则有 7 列:

INSERT INTO manpower.vipbadge (vess_bld_dt,                                           -- 1
                               dt_of_deli,                                            -- 2
                               ship_reg_valdt,                                        -- 3
                               safety_mgmt_cert_valdt,                                -- 4
                               hull_ins_comp_valdt,                                   -- 5
                               appr_dt,                                               -- 6
                               entry_dt)                                              -- 7
     VALUES (TO_DATE ('01/01/2023', 'dd/MM/yyyy'),                                    -- 1
             ' ',                                                                     -- 2
             TO_DATE ('31/12/2025', 'dd/MM/yyyy'),                                    -- 3
             TO_DATE ('28/12/2025', 'dd/MM/yyyy'),                                    -- 4
             ' ',                                                                     -- 5
             TO_DATE ('17/02/2025', 'dd/MM/yyyy'),                                    -- 6
             SYSDATE                                                                  -- 7
           );
  • 其中一些具有
    TO_DATE
    以及与值匹配的格式掩码
  • sysdate
    是一个返回
    date
    数据类型
  • 的函数
  • 有两列(
    dt_of_deli
    hull_ins_comp_valdt
    看起来可疑,因为您在其中放入了空格。这可能是导致错误的原因。

演示:

SQL> create table test (id number, some_date date);

Table created.

将空间放入

some_date

SQL> insert into test (id, some_date) values (1, ' ');
insert into test (id, some_date) values (1, ' ')
                                            *
ERROR at line 1:
ORA-01847: day of month must be between 1 and last day of month


SQL>

因此,请回顾这两列。如果您希望它们为空,请在其中插入

NULL
,而不是空格:

SQL> insert into test (id, some_date) values (1, null);

1 row created.

SQL>
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.