From f4068ba82f4e650dc580df5cadc68ee67814120e Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 10:17:34 +0800 Subject: [PATCH 1/7] fix datediff bug --- .../java/org/apache/doris/rewrite/FEFunctions.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java index 6b572cc8dfd930..619ecbc8122930 100644 --- a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -17,6 +17,7 @@ package org.apache.doris.rewrite; +import com.google.common.collect.Lists; import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.DecimalLiteral; import org.apache.doris.analysis.FloatLiteral; @@ -55,9 +56,15 @@ public class FEFunctions { @FEFunction(name = "datediff", argTypes = { "DATETIME", "DATETIME" }, returnType = "INT") public static IntLiteral dateDiff(LiteralExpr first, LiteralExpr second) throws AnalysisException { - long diff = getTime(first) - getTime(second); - long datediff = diff / 1000 / 60 / 60 / 24; - return new IntLiteral(datediff, Type.INT); + String[] parsePatterns = { "yyyyMMdd" }; + try { + long diff = DateUtils.parseDate(first.getStringValue(), parsePatterns).getTime() + - DateUtils.parseDate(second.getStringValue(), parsePatterns).getTime(); + long datediff = diff / 1000 / 60 / 60 / 24; + return new IntLiteral(datediff, Type.INT); + } catch (ParseException e) { + throw new AnalysisException(e.getLocalizedMessage()); + } } @FEFunction(name = "date_add", argTypes = { "DATETIME", "INT" }, returnType = "DATETIME") From 3258b8d0514d0b31d14e4bd9b2d7851fddfb6f25 Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 10:28:14 +0800 Subject: [PATCH 2/7] fix --- fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java | 1 - 1 file changed, 1 deletion(-) diff --git a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java index 619ecbc8122930..dcd93356d509e2 100644 --- a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -17,7 +17,6 @@ package org.apache.doris.rewrite; -import com.google.common.collect.Lists; import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.DecimalLiteral; import org.apache.doris.analysis.FloatLiteral; From c651a3ade8d1fb33e75d4b267ac9316626bdefa4 Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 10:32:36 +0800 Subject: [PATCH 3/7] fix --- fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java index dcd93356d509e2..4bf8cd31264c3a 100644 --- a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -57,6 +57,7 @@ public class FEFunctions { public static IntLiteral dateDiff(LiteralExpr first, LiteralExpr second) throws AnalysisException { String[] parsePatterns = { "yyyyMMdd" }; try { + //DATEDIFF function only uses the date part for calculations and ignores the time part long diff = DateUtils.parseDate(first.getStringValue(), parsePatterns).getTime() - DateUtils.parseDate(second.getStringValue(), parsePatterns).getTime(); long datediff = diff / 1000 / 60 / 60 / 24; From 121a772549ceb33dc4bc61face10576b1434d14b Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 14:51:09 +0800 Subject: [PATCH 4/7] add datediff unittest --- .../java/org/apache/doris/rewrite/FEFunctions.java | 2 +- .../org/apache/doris/rewrite/FEFunctionsTest.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java index 4bf8cd31264c3a..ba0bbc00d34306 100644 --- a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -57,7 +57,7 @@ public class FEFunctions { public static IntLiteral dateDiff(LiteralExpr first, LiteralExpr second) throws AnalysisException { String[] parsePatterns = { "yyyyMMdd" }; try { - //DATEDIFF function only uses the date part for calculations and ignores the time part + // DATEDIFF function only uses the date part for calculations and ignores the time part long diff = DateUtils.parseDate(first.getStringValue(), parsePatterns).getTime() - DateUtils.parseDate(second.getStringValue(), parsePatterns).getTime(); long datediff = diff / 1000 / 60 / 60 / 24; diff --git a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java index c2602077bd82b3..f3246f44269e18 100644 --- a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java +++ b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java @@ -52,6 +52,17 @@ public void unixtimestampTest() { } } + @Test + public void dateDiffTest() throws AnalysisException { + IntLiteral actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:59"), new StringLiteral("2010-12-31")); + IntLiteral expectedResult = new IntLiteral(-31); + Assert.assertEquals(expectedResult, actualResult); + + actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:50"), new StringLiteral("2010-12-30 23:59:59")); + expectedResult = new IntLiteral(-30); + Assert.assertEquals(expectedResult, actualResult); + } + @Test public void dateAddTest() throws AnalysisException { DateLiteral actualResult = FEFunctions.dateAdd(new StringLiteral("2018-08-08"), new IntLiteral(1)); From 8609c38e4dde46c8a0834ae11fc54850e17c2ece Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 14:58:05 +0800 Subject: [PATCH 5/7] fix --- fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java index f3246f44269e18..a36f6ffc0e304b 100644 --- a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java +++ b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java @@ -58,7 +58,7 @@ public void dateDiffTest() throws AnalysisException { IntLiteral expectedResult = new IntLiteral(-31); Assert.assertEquals(expectedResult, actualResult); - actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:50"), new StringLiteral("2010-12-30 23:59:59")); + actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:50"), new StringLiteral("2010-12-30 23:59:59")); expectedResult = new IntLiteral(-30); Assert.assertEquals(expectedResult, actualResult); } From d63a6782974889d58796b999cb1facf0052d4abc Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 15:04:47 +0800 Subject: [PATCH 6/7] fix --- .../test/java/org/apache/doris/rewrite/FEFunctionsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java index a36f6ffc0e304b..d09e35d32b9445 100644 --- a/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java +++ b/fe/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java @@ -54,11 +54,11 @@ public void unixtimestampTest() { @Test public void dateDiffTest() throws AnalysisException { - IntLiteral actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:59"), new StringLiteral("2010-12-31")); + IntLiteral actualResult = FEFunctions.dateDiff(new DateLiteral("2010-11-30 23:59:59", Type.DATETIME), new DateLiteral("2010-12-31", Type.DATE)); IntLiteral expectedResult = new IntLiteral(-31); Assert.assertEquals(expectedResult, actualResult); - actualResult = FEFunctions.dateDiff(new StringLiteral("2010-11-30 23:59:50"), new StringLiteral("2010-12-30 23:59:59")); + actualResult = FEFunctions.dateDiff(new DateLiteral("2010-11-30 23:59:50", Type.DATETIME), new DateLiteral("2010-12-30 23:59:59", Type.DATETIME)); expectedResult = new IntLiteral(-30); Assert.assertEquals(expectedResult, actualResult); } From 1ee83e7c5bff8dfd9ef21a488fa60ae67aa63e24 Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Tue, 28 May 2019 15:42:45 +0800 Subject: [PATCH 7/7] fix --- fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java index ba0bbc00d34306..74a1607ae02125 100644 --- a/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -38,6 +38,7 @@ import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatterBuilder; +import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; @@ -55,11 +56,10 @@ public class FEFunctions { @FEFunction(name = "datediff", argTypes = { "DATETIME", "DATETIME" }, returnType = "INT") public static IntLiteral dateDiff(LiteralExpr first, LiteralExpr second) throws AnalysisException { - String[] parsePatterns = { "yyyyMMdd" }; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { // DATEDIFF function only uses the date part for calculations and ignores the time part - long diff = DateUtils.parseDate(first.getStringValue(), parsePatterns).getTime() - - DateUtils.parseDate(second.getStringValue(), parsePatterns).getTime(); + long diff = sdf.parse(first.getStringValue()).getTime() - sdf.parse(second.getStringValue()).getTime(); long datediff = diff / 1000 / 60 / 60 / 24; return new IntLiteral(datediff, Type.INT); } catch (ParseException e) {