浏览代码

新增TO_TIMESTAMP_TZ函数支持

life 1 年之前
父节点
当前提交
df711f0c0a

+ 24 - 1
dbsyncer-common/src/main/java/org/dbsyncer/common/util/DateFormatUtil.java

@@ -89,6 +89,14 @@ public abstract class DateFormatUtil {
             .optionalEnd()
             .toFormatter();
 
+    private static DateTimeFormatter TS_TZ_FORMATOracle = new DateTimeFormatterBuilder()
+            .append(NON_ISO_LOCAL_DATE)
+            .appendLiteral(' ')
+            .append(DateTimeFormatter.ISO_LOCAL_TIME)
+            .appendLiteral(' ')
+            .appendOffset("+HH:mm", "")
+            .toFormatter();
+
     public static String getCurrentTime() {
         return LocalDateTime.now().format(TIME_FORMATTER);
     }
@@ -165,7 +173,11 @@ public abstract class DateFormatUtil {
         try {
             parsedTimestamp = TS_TZ_FORMAT.parse(s);
         } catch (DateTimeParseException e) {
-            parsedTimestamp = TS_TZ_WITH_SECONDS_FORMAT.parse(s);
+            try {
+                parsedTimestamp = TS_TZ_WITH_SECONDS_FORMAT.parse(s);
+            }catch (DateTimeParseException e1){
+                parsedTimestamp = TS_TZ_FORMATOracle.parse(s);
+            }
         }
         return OffsetDateTime.from(parsedTimestamp).withOffsetSameInstant(ZoneOffset.UTC);
     }
@@ -209,4 +221,15 @@ public abstract class DateFormatUtil {
         return s;
     }
 
+    public static void main(String[] args) {
+        DateTimeFormatter TS_TZ_FORMAT1 = new DateTimeFormatterBuilder()
+                .append(NON_ISO_LOCAL_DATE)
+                .appendLiteral(' ')
+                .append(DateTimeFormatter.ISO_LOCAL_TIME)
+                .appendLiteral(' ')
+                .appendOffset("+HH:mm", "")
+                .toFormatter();
+        System.out.println(TS_TZ_FORMAT1.parse("2023-02-14 10:11:12.123 +08:00"));
+    }
+
 }

+ 1 - 1
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/AbstractParser.java

@@ -69,7 +69,7 @@ public abstract class AbstractParser implements Parser {
                     break;
                 //timezone
                 case OracleTypes.TIMESTAMPTZ:
-                    data.add(oracleColumnValue.asTimestamp());
+                    data.add(oracleColumnValue.asOffsetDateTime());
                     break;
                 default:
                     data.add(oracleColumnValue.asString());

+ 52 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/logminer/parser/OracleColumnValue.java

@@ -18,6 +18,7 @@ import java.math.BigInteger;
 import java.sql.Date;
 import java.sql.Time;
 import java.sql.Timestamp;
+import java.time.OffsetDateTime;
 import java.util.List;
 import java.util.Objects;
 
@@ -39,6 +40,9 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
         if (getValue() instanceof StringValue){
             return StringUtil.replace(((StringValue) getValue()).getValue(),StringUtil.DOUBLE_QUOTATION,StringUtil.EMPTY);
         }
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
         return getValue().toString();
     }
 
@@ -101,6 +105,9 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
         if (getValue() instanceof NullValue){
             return null;
         }
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
         Function function = (Function) getValue();
         List<String> multipartName = function.getMultipartName();
         ExpressionList parameters = function.getParameters();
@@ -125,7 +132,45 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
                     return toDate(value);
                 case "TO_TIMESTAMP":
                     return toTimestamp(value);
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public OffsetDateTime asOffsetDateTime(){
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
+        if (getValue() instanceof NullValue){
+            return null;
+        }
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
+        Function function = (Function) getValue();
+        List<String> multipartName = function.getMultipartName();
+        ExpressionList parameters = function.getParameters();
+        if (CollectionUtils.isEmpty(multipartName) || CollectionUtils.isEmpty(parameters)) {
+            return null;
+        }
+
+        String nameType = Objects.toString(multipartName.get(0));
+        Object value = parameters.get(0);
+        if (nameType == null || value == null) {
+            return null;
+        }
 
+        if (value instanceof StringValue) {
+            StringValue val = (StringValue) value;
+            value = val.getValue();
+        }
+
+        try {
+            switch (nameType) {
+                case "TO_TIMESTAMP_TZ":
+                    return toOffsetDateTime(value);
             }
         } catch (Exception e) {
             logger.error(e.getMessage(), e);
@@ -146,6 +191,9 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
         if (getValue() instanceof NullValue){
             return null;
         }
+        if (getValue() instanceof IsNullExpression){
+            return null;
+        }
         Object ob = asString();
         if (ob == null){
             return null;
@@ -161,4 +209,8 @@ public class OracleColumnValue extends AbstractColumnValue<Expression> {
         return DateFormatUtil.stringToTimestamp(StringUtil.replace(Objects.toString(value), StringUtil.POINT, StringUtil.EMPTY));
     }
 
+    private OffsetDateTime toOffsetDateTime(Object value){
+        return DateFormatUtil.timestampWithTimeZoneToOffsetDateTime(Objects.toString(value));
+    }
+
 }