You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/13 00:32:30 UTC

[doris] branch master updated: FIX: fix datetimev2 decimal error. (#10736)

This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new f9f711cd16 FIX: fix datetimev2 decimal error. (#10736)
f9f711cd16 is described below

commit f9f711cd16525ef2f3a0dbfd986cdab6d74f1711
Author: Stalary <st...@163.com>
AuthorDate: Wed Jul 13 08:32:26 2022 +0800

    FIX: fix datetimev2 decimal error. (#10736)
---
 .../src/main/java/org/apache/doris/analysis/DateLiteral.java |  7 ++++++-
 .../test/java/org/apache/doris/analysis/DateLiteralTest.java | 12 ++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index 88898f6c64..a20e26000a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -285,6 +285,7 @@ public class DateLiteral extends LiteralExpr {
         this.hour = dateTime.getHourOfDay();
         this.minute = dateTime.getMinuteOfHour();
         this.second = dateTime.getSecondOfMinute();
+        this.microsecond = dateTime.getMillisOfSecond() * 1000L;
         this.type = type;
     }
 
@@ -433,12 +434,16 @@ public class DateLiteral extends LiteralExpr {
             if (((ScalarType) type).decimalScale() == 0) {
                 return s;
             }
-            return s + "." + microsecond / (10L * (6 - ((ScalarType) type).decimalScale()));
+            return s + "." + getDecimalNumber();
         } else {
             return String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second);
         }
     }
 
+    public long getDecimalNumber() {
+        return Double.valueOf(microsecond / (Math.pow(10, 6 - ((ScalarType) type).decimalScale()))).longValue();
+    }
+
     private String convertToString(PrimitiveType type) {
         if (type == PrimitiveType.DATE || type == PrimitiveType.DATEV2) {
             return String.format("%04d-%02d-%02d", year, month, day);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralTest.java
index db2dbd797d..c20bcf194e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralTest.java
@@ -23,6 +23,7 @@ import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.InvalidFormatException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 
+import org.joda.time.LocalDateTime;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -344,4 +345,15 @@ public class DateLiteralTest {
         }
         Assert.assertFalse(hasException);
     }
+
+    @Test
+    public void testDateTimeV2Decimal() throws AnalysisException {
+        DateLiteral dateLiteral1 = new DateLiteral(LocalDateTime.now(),
+                DateLiteral.getDefaultDateType(ScalarType.createDatetimeV2Type(3)));
+        Assert.assertTrue(dateLiteral1.getDecimalNumber() >= 100 && dateLiteral1.getDecimalNumber() < 1000);
+
+        DateLiteral dateLiteral2 = new DateLiteral(LocalDateTime.now(),
+                DateLiteral.getDefaultDateType(ScalarType.createDatetimeV2Type(5)));
+        Assert.assertTrue(dateLiteral2.getDecimalNumber() >= 10000 && dateLiteral2.getDecimalNumber() < 100000);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org