Как преобразовать метку времени с часовым поясом в LocalDateTime в DataWeave - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь перенести объект из базы данных Oracle в базу данных сервера SQL, используя Mulesoft. Один из столбцов - это отметка времени с часовым поясом, но всякий раз, когда я передаю ее, я получаю эту ошибку:

org.mule.runtime.core.internal.message.ErrorBuilder $ ErrorImplementation

description = Ошибка при преобразовании типа данных nvarchar в datetimeoffset.

errorType = DB: QUERY_EXECUTION
reason = org.mule.extension.db.api.exception.connection.QueryExecutionException errorMessage = -
childErrors = []

Я пытался использовать это решение, но оно все еще не работает:

 payload.FILE_DATE_INSERT as String {format: "DD-MON-RR HH.MI.SSXFF AM TZR"} as LocalDateTime {format: "yyyy-MM-dd'T'HH:mm:ssZ"}

Ошибка:

Невозможно принудительно применить объект {class: oracle. sql .TIMESTAMPTZ} (org. mule.weave.v2.module.pojo.reader. JavaBeanObjectValue@eb085528) в строку

11 | FILE_DATE_INSERT: payload.FILE_DATE_INSERT в виде строки {формат: "DD-MON-RR HH.MI.SSXFF AM TZR"} в виде LocalDateTime {формат: "гггг-мм-дд'т'ч: мм: ссЗ"},

Трассировка:

на главном (строка: 11, столбец: 19) "оценочное выражение:" {FILE_CODE: payload.FILE_CODE, FILECONTENTTYPE_CODE: payload.FILECONTENTTYPE_CODE, FILE_NAME: payload.FILE_NAME, FILE_NAME, FILE_NAME, FI FILE_SIZE, FILE_STATUS: payload.FILE_STATUS, USER_CODE: payload.USER_CODE, FILE_UPLOAD_CODE: payload.FILE_UPLOAD_CODE, FILE_UPLOAD_TEMP: payload.FILE_UPLOAD_TEMP, FILESTORAGE_CODE: payload.FILESTORAGE_CODE, FILE_DATE_INSERT: payload.FILE_DATE_INSERT как строка {формат: «DD-MON-RR HH. MI.SSXFF AM TZR "} as LocalDateTime {format:" yyyy-MM-dd'T'HH: mm: ssZ "},}". Тип ошибки: MULE: EXPRESSION Элемент: DOC_TFILEMigrationFlow / processors / 1 / processors / 0 @ DatabaseConnectorPO C: docLogi c. xml: 75 (Вставить в DOC_TFILE) Элемент XML: {call InsertIntoFile (: FILE_CODE,: FILECONTENTTYPE_CODE,: FILE_NAME,: FILE_SIZE,: FILE_STATUS,: FILE_STATUS,: R_CODE,: FILE_UPLOAD_CODE,: FILE_UPLOAD_TEMP,: FILESTORAGE_CODE, FILE_DATE_INSERT)} # [{FILE_CODE: payload.FILE_CODE, FILECONTENTTYPE_CODE: payload.FILECONTENTTYPE_CODE, FILE_NAME: payload.FILE_NAME, FILE_SIZE: payload.FILE_SIZE, FILE_STATUS: payload.FILE_STATUS, USER_CODE: полезная нагрузка .USER_CODE, FILE_UPLOAD_CODE: payload.FILE_UPLOAD_CODE, FILE_UPLOAD_TEMP: payload.FILE_UPLOAD_TEMP, FILESTORAGE_CODE: payload.FILESTORAGE_CODE, FILE_DATE_INSERT: payload.FILE_DATE_INSERT как строка {формат: "DD-MON-RR HH.MI.SSXFF AM TZR"} как LocalDateTime {формат : "гггг-ММ-дд'Т'ЧЧ: мм: ссЗ"},}]

(установить ведение журнала уровня отладки или '-Dmule.verbose.exceptions = true' для всего)


Кто-нибудь знает, как правильно конвертировать его с помощью Dataweave?

Спасибо!

Ответы [ 2 ]

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

Исходя из приведенного вами примера, вам необходимо настроить форматирование для вашего dw, а затем привести к строке для переформатирования. Например,

%dw 2.0
output application/json
---
"10-NOV-19 02.06.50.708000000 PM EUROPE/LONDON" as DateTime {format: "dd-MMM-yy hh.mm.ss.SSSSSSSSS a VV"} as String {format: "yyyy-MM-dd'T'HH:mm:ssZ"}

выведет

"2019-11-10T14:06:50+0000"
0 голосов
/ 20 апреля 2020

Видите, вы делаете тройное преобразование String -> LocalDateTime -> what_it_is_in_the_database

Слабое звено находится на последнем этапе этого преобразования - что думает об этом DW / метаданные и что на самом деле находится в базе данных .

Могу ли я предложить, чтобы внутри Mule / DW вы конвертировали в строку, а затем в базе данных конвертировали строку в любой формат, требуемый для БД?

По крайней мере, вы можете контролировать и видеть полностью понятным преобразование в одном месте (фактически в обоих - в DW и в DB).

https://simpleflatservice.com/mule4/AvoidCoversionsOrMakeThemNative.html

...