【问题标题】:How to convert Timestamp with Time Zone to LocalDateTime in DataWeave如何在 DataWeave 中将带时区的时间戳转换为 LocalDateTime
【发布时间】:2020-05-02 22:34:34
【问题描述】:

我正在尝试使用 Mulesoft 将对象从 Oracle 数据库传输到 SQL Server 数据库。其中一列是带有时区的时间戳,但每当我传输它时,我都会收到此错误:

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

description=将数据类型 nvarchar 转换为 datetimeoffset 时出错。

errorType=DB:QUERY_EXECUTION
原因=org.mule.extension.db.api.exception.connection.QueryExecutionException 错误消息=-
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"}

错误:

无法将 Object { class: oracle.sql.TIMESTAMPTZ } (org.mule.weave.v2.module.pojo.reader.JavaBeanObjectValue@eb085528) 强制转换为字符串

11| FILE_DATE_INSERT: 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"},

追踪:

在 main (line: 11, column: 19)" 评估表达式:"{ FILE_CODE:有效载荷.FILE_CODE, FILECONTENTTYPE_CODE:有效载荷.FILECONTENTTYPE_CODE, FILE_NAME:有效载荷.FILE_NAME, FILE_SIZE:有效载荷.FILE_SIZE, FILE_STATUS:有效载荷.FILE_STATUS, USER_CODE:有效载荷.USER_CODE, FILE_UPLOAD_CODE:有效载荷.FILE_UPLOAD_CODE, FILE_UPLOAD_TEMP:有效载荷.FILE_UPLOAD_TEMP, FILESTORAGE_CODE:有效载荷.FILESTORAGE_CODE, FILE_DATE_INSERT:payload.FILE_DATE_INSERT 作为字符串 {格式:“DD-MON-RR HH.MI.SSXFF AM TZR”} 作为 LocalDateTime {格式:“yyyy-MM-dd'T'HH:mm:ssZ”}, }”。 错误类型:MULE:EXPRESSION 元素:DOC_TFILEMigrationFlow/processors/1/processors/0 @ DatabaseConnectorPOC:docLogic.xml:75(插入 DOC_TFILE) 元素 XML: {调用 InsertIntoFile (:FILE_CODE,:FILECONTENTTYPE_CODE,:FILE_NAME,:FILE_SIZE,:FILE_STATUS,:USER_CODE,:FILE_UPLOAD_CODE, :FILE_UPLOAD_TEMP,:FILESTORAGE_CODE, FILE_DATE_INSERT)} #[{ FILE_CODE:有效载荷.FILE_CODE, FILECONTENTTYPE_CODE:有效载荷.FILECONTENTTYPE_CODE, FILE_NAME : 有效载荷.FILE_NAME, FILE_SIZE : 有效载荷.FILE_SIZE, FILE_STATUS : 有效载荷.FILE_STATUS, USER_CODE:有效载荷.USER_CODE, FILE_UPLOAD_CODE:有效载荷.FILE_UPLOAD_CODE, FILE_UPLOAD_TEMP:有效载荷.FILE_UPLOAD_TEMP, FILESTORAGE_CODE:有效载荷.FILESTORAGE_CODE, FILE_DATE_INSERT: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"}, }]

(为所有内容设置调试级别日志记录或“-Dmule.verbose.exceptions=true”)


有谁知道如何使用 Dataweave 正确转换它?

谢谢!

【问题讨论】:

  • 您使用的是最新版本的 DB 连接器吗?这是一个错误
  • 我已经更新到最新版本,但错误仍然存​​在。
  • 您是否有尝试格式化的原始时间戳值的示例?
  • 是的。在这里:19 年 11 月 10 日 02.06.50.708000000 PM 欧洲/伦敦

标签: mule dataweave mulesoft timestamp-with-timezone


【解决方案1】:

根据您提供的示例,您需要调整 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"

【讨论】:

    【解决方案2】:

    看,你正在做三重转换 String -> LocalDateTime -> 不管什么_it_is_in_the_database

    薄弱环节在此转换的最后一站 - DW/元数据对它的看法以及它在数据库中的真实情况。

    我可以建议在 Mule/DW 中转换为字符串,然后在数据库中将字符串转换为 DB 所需的任何格式吗?

    至少您可以在一个地方控制和查看完全可理解的转换(实际上在两者中 - 在 DW 和 DB 中)。

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

    【讨论】:

    • 感谢您的回答!我正在探索这种方法,但我在转换部分遇到了困难,我认为这是因为最后的时区。
    猜你喜欢
    • 2018-07-15
    • 2019-10-07
    • 1970-01-01
    • 2021-09-22
    • 2018-12-18
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多