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 fff308352f [fix](nereids)the microseconds value is wrong when create datatimev2 literal from LocalDateTime (#21089) fff308352f is described below commit fff308352feec551bc8fe797d52adf3c42a07f4a Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Thu Jun 22 00:40:53 2023 +0800 [fix](nereids)the microseconds value is wrong when create datatimev2 literal from LocalDateTime (#21089) * [fix](nereids)the microseconds value is wrong when create datatimev2 literal from LocalDateTime * fix code style --- .../expressions/literal/DateTimeV2Literal.java | 42 ++++++---------------- .../org/apache/doris/nereids/util/DateUtils.java | 2 +- 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java index e180c667e1..b3152b0bc1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeV2Literal.java @@ -62,27 +62,9 @@ public class DateTimeV2Literal extends DateTimeLiteral { return visitor.visitDateTimeV2Literal(this, context); } - private long formatMicroSecond(long microSecond) { - if (microSecond == 0) { - return microSecond; - } - while (10 * microSecond <= 999999) { - microSecond = 10 * microSecond; - } - return microSecond; - } - - /* - * Legacy and Nereids have different approaches to handling accuracy in scale. - * For example, with a scale of 5, Legacy would store 123450, while Nereids - * would store it as 12345. - * Therefore, we need to perform a conversion. - * Alternatively, can we standardize the format? - */ @Override public LiteralExpr toLegacyLiteral() { - return new org.apache.doris.analysis.DateLiteral(year, month, day, hour, minute, second, - formatMicroSecond(microSecond), + return new org.apache.doris.analysis.DateLiteral(year, month, day, hour, minute, second, microSecond, getDataType().toCatalogDataType()); } @@ -93,15 +75,10 @@ public class DateTimeV2Literal extends DateTimeLiteral { @Override public String getStringValue() { - int scale = getDataType().getScale(); - if (scale == 0) { - return String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second); - } else { - int microsecond = (int) (microSecond / Math.pow(10, DateTimeV2Type.MAX_SCALE - scale)); - return String.format("%04d-%02d-%02d %02d:%02d:%02d" - + ".%0" + scale + "d", - year, month, day, hour, minute, second, microsecond); - } + return String.format("%04d-%02d-%02d %02d:%02d:%02d" + + (getDataType().getScale() > 0 ? ".%0" + getDataType().getScale() + "d" : ""), + year, month, day, hour, minute, second, + (int) (microSecond / Math.pow(10, DateTimeV2Type.MAX_SCALE - getDataType().getScale()))); } @Override @@ -153,11 +130,12 @@ public class DateTimeV2Literal extends DateTimeLiteral { * convert java LocalDateTime object to DateTimeV2Literal object. */ public static Expression fromJavaDateType(LocalDateTime dateTime, int precision) { + long value = (long) Math.pow(10, DateTimeV2Type.MAX_SCALE - precision); return isDateOutOfRange(dateTime) ? new NullLiteral(DateTimeV2Type.of(precision)) - : new DateTimeV2Literal(DateTimeV2Type.of(precision), - dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), - dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(), - dateTime.getNano() / (long) Math.pow(10, 9 - precision)); + : new DateTimeV2Literal(DateTimeV2Type.of(precision), dateTime.getYear(), + dateTime.getMonthValue(), dateTime.getDayOfMonth(), dateTime.getHour(), + dateTime.getMinute(), dateTime.getSecond(), + (dateTime.getNano() / 1000) / value * value); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java index 56201460e7..1ae262a172 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java @@ -158,7 +158,7 @@ public class DateUtils { getOrDefault(accessor, ChronoField.HOUR_OF_DAY), getOrDefault(accessor, ChronoField.MINUTE_OF_HOUR), getOrDefault(accessor, ChronoField.SECOND_OF_MINUTE), - 1000 * getOrDefault(accessor, ChronoField.MICRO_OF_SECOND)); + getOrDefault(accessor, ChronoField.NANO_OF_SECOND)); } public static int getOrDefault(final TemporalAccessor accessor, final ChronoField field) { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org