ORA-01830: изображение формата даты заканчивается до преобразования всей входной строки

 INSERT INTO TAB_THD_ATTND_EVENTS(
      ATND_EVNT_INDEXNO,            ATND_EVNT_USERID,             ATND_EVNT_USERNAME,           ATND_EVNT_DT,
      ATND_EVNT_ENEX_TYPE,          ATTND_EVNT_MSTR_CNTRLID,      ATTND_EVNT_DOOR_CNTRLID,      ATTND_EVNT_SPCL_FNCTNID,
      ATTND_EVNT_LEAVE_DT,          ATTND_EVNT_INSERT_DT,         ATTND_EVNT_PRCS_FLAG,         ATTND_EVNT_PRCS_DT,
      CR_DATE
 )
 SELECT 
      X.ATND_EVNT_INDEXNO,          X.ATND_EVNT_USERID,           X.ATND_EVNT_USERNAME,         TO_DATE(X.ATND_EVNT_DT,'DD/MM/YYYY HH24:MI:SS'),
      X.ATND_EVNT_ENEX_TYPE,        X.ATTND_EVNT_MSTR_CNTRLID,    X.ATTND_EVNT_DOOR_CNTRLID,    X.ATTND_EVNT_SPCL_FNCTNID,
      X.ATTND_EVNT_LEAVE_DT,        TO_DATE(X.ATTND_EVNT_INSERT_DT,'MM/DD/YYYY HH24:MI:SS'),    'N',      '',
      SYSDATE 
 FROM TAB_TDL_ATTND_UPLOAD_TEMP T,
      (XMLTABLE('/DocumentElement/event-ta' PASSING T.ATTND_DATA_XML COLUMNS
                     ATND_EVNT_INDEXNO NUMBER PATH './IndexNo',
                     ATND_EVNT_USERID NUMBER PATH './UserID',
                     ATND_EVNT_USERNAME VARCHAR2(100) PATH './UserName',
                     ATND_EVNT_DT DATE PATH './EventDateTime',
                     ATND_EVNT_ENEX_TYPE NUMBER PATH './EntryExitType',
                     ATTND_EVNT_MSTR_CNTRLID NUMBER PATH './MasterControllerID',
                     ATTND_EVNT_DOOR_CNTRLID NUMBER PATH './DoorControllerID',
                     ATTND_EVNT_SPCL_FNCTNID NUMBER PATH './SpecialFunctionID',
                     ATTND_EVNT_LEAVE_DT DATE PATH './LeaveDT',
                     ATTND_EVNT_INSERT_DT DATE PATH './IDateTime')) X
 WHERE T.ATTND_UPLOAD_NO = P_SEQNO;

Выше написан мой запрос на вставку в PLSQL, а ниже приведены данные строки XML, которые я пытаюсь вставить, но получаю указанную ошибку. Может ли кто-нибудь помочь мне с этим?

<event-ta>
<IndexNo>85672</IndexNo>
<UserID>1001</UserID>
<UserName>Testing Data</UserName>
<EventDateTime>17/04/2023 08:08:50</EventDateTime>
<EntryExitType>0</EntryExitType>
<MasterControllerID>34</MasterControllerID>
<DoorControllerID>1</DoorControllerID>
<SpecialFunctionID>0</SpecialFunctionID>
<LeaveDT/>
<IDateTime>04/17/2023 08:08:53</IDateTime>
</event-ta>

X.ATND_EVNT_DT и X.ATTND_EVNT_INSERT_DT, по-видимому, являются столбцами типа данных VARCHAR2 и должны содержать значение в указанном вами формате, а именно: ДД/ММ/ГГГГ ЧЧ24:МИ:СС (и ММ/ДД/ГГГГ ЧЧ24:МИ:СС). ). Oracle говорит, что значение столбца на самом деле не соответствует этому формату. Вообще говоря, вы должны хранить значения дат в столбцах типа DATE, чтобы избежать таких проблем. Что теперь? Найдите значения, отличающиеся от указанного вами формата, и исправьте их.

Littlefoot 19.04.2023 11:33

Какое это имеет отношение к VB.NET или ASP.NET? Если проблема не связана с этими вещами, тот факт, что приложение, в котором возникает проблема, создано с этими вещами, не имеет значения.

jmcilhinney 19.04.2023 13:54

Можно ли использовать ISO 8601 и только ISO 8601 для формата даты в XML? Какой правильный формат для даты/времени в файле XML. В любом случае, можете ли вы уменьшить количество элементов, которые он пытается прочитать, пока он не перестанет выдавать ошибку? Тогда вы знаете, какая часть пошла не так.

Andrew Morton 19.04.2023 16:04

Можете ли вы сократить свой код, удалив ненужный код? Оставьте только код, который воспроизводит ту же ошибку! И удалите vb.net из списка тегов! Можете ли вы воспроизвести ту же ошибку при удалении INSERT ? Если да, удалите часть INSERT из своего вопроса. Сделайте свой вопрос максимально простым. Когда вы уменьшите свой код, можете ли вы отправить нам (без INSERT), можете ли вы отобразить, что отображает ваш SELECT при удалении преобразования TO_DATE, чтобы мы могли видеть входное значение TO_DATE?

schlebe 22.04.2023 08:38

«ATTND_EVNT_INSERT_DT DATE» должна возвращать дату, верно? Если да, то зачем вам TO_DATE? Не назначайте TO_DATE свидание. TO_DATE строки, чтобы сделать их датами.

Paul W 22.04.2023 18:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы ответить на ваш вопрос «Почему это», проблема возникает из-за того, что ваше определение ATTND_EVNT_INSERT_DT как DATE неверно, потому что формат даты элемента неверен (конечно, отличается от формата данных по умолчанию Oracle).

Чтобы решить вашу проблему, я предлагаю использовать следующую сокращенную команду (без INSERT, потому что я не думаю, что проблема в операторе INSERT Sql).

SELECT TO_DATE(X.ATND_EVNT_DT        ,'DD/MM/YYYY HH24:MI:SS')
      ,TO_DATE(X.ATTND_EVNT_INSERT_DT,'MM/DD/YYYY HH24:MI:SS')
  FROM TAB_TDL_ATTND_UPLOAD_TEMP T
    ,(XMLTABLE('/DocumentElement/event-ta' 
        PASSING T.ATTND_DATA_XML 
        COLUMNS ATND_EVNT_DT         VARCHAR2(20) PATH './EventDateTime'
               ,ATTND_EVNT_INSERT_DT VARCHAR2(20) PATH './IDateTime'
              )
     ) X
 WHERE T.ATTND_UPLOAD_NO = P_SEQNO;

Я только заменил DATE в части XML на VARCHAR2(20).

Если эта команда не работает, сообщите нам о том, что возвращает следующая команда

SELECT X.ATND_EVNT_DT
      ,X.ATTND_EVNT_INSERT_DT
  FROM TAB_TDL_ATTND_UPLOAD_TEMP T
    ,(XMLTABLE('/DocumentElement/event-ta' 
        PASSING T.ATTND_DATA_XML 
        COLUMNS ATND_EVNT_DT         VARCHAR2(20) PATH './EventDateTime'
               ,ATTND_EVNT_INSERT_DT VARCHAR2(20) PATH './IDateTime'
              )
     ) X
 WHERE T.ATTND_UPLOAD_NO = P_SEQNO;

Другие вопросы по теме