diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java index 97c9ad8b09b99..fe0289f016cb5 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctions.java @@ -150,7 +150,33 @@ public static ConstantOperator dateDiff(ConstantOperator first, ConstantOperator first.getDatetime().truncatedTo(ChronoUnit.DAYS)).toDays()); } - @ConstantFunction(name = "years_add", argTypes = {DATETIME, INT}, returnType = DATETIME, isMonotonic = true) + @ConstantFunction.List(list = { + @ConstantFunction(name = "to_days", argTypes = {DATETIME}, returnType = INT, isMonotonic = true), + @ConstantFunction(name = "to_days", argTypes = {DATE}, returnType = INT, isMonotonic = true) + }) + public static ConstantOperator to_days(ConstantOperator first) { + ConstantOperator second = ConstantOperator.createDatetime(LocalDateTime.of(0000, 01, 01, 00, 00, 00)); + return ConstantOperator.createInt((int) Duration.between( + second.getDatetime().truncatedTo(ChronoUnit.DAYS), + first.getDatetime().truncatedTo(ChronoUnit.DAYS)).toDays()); + } + + @ConstantFunction.List(list = { + @ConstantFunction(name = "dayofweek", argTypes = {DATETIME}, returnType = INT), + @ConstantFunction(name = "dayofweek", argTypes = {DATE}, returnType = INT), + @ConstantFunction(name = "dayofweek", argTypes = {INT}, returnType = INT) + }) + public static ConstantOperator dayofweek(ConstantOperator date) { + // LocalDateTime.getDayOfWeek is return day of the week, such as monday is 1 and sunday is 7. + // function of dayofweek in starrocks monday is 2 and sunday is 1, so need mod 7 and plus 1. + return ConstantOperator.createInt((date.getDatetime().getDayOfWeek().getValue()) % 7 + 1); + } + + @ConstantFunction.List(list = { + @ConstantFunction(name = "years_add", argTypes = {DATETIME, + INT}, returnType = DATETIME, isMonotonic = true), + @ConstantFunction(name = "years_add", argTypes = {DATE, INT}, returnType = DATE, isMonotonic = true) + }) public static ConstantOperator yearsAdd(ConstantOperator date, ConstantOperator year) { return ConstantOperator.createDatetime(date.getDatetime().plusYears(year.getInt())); } diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java index 2b0efdd665fc6..0e9a4b47a618e 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rewrite/ScalarOperatorFunctionsTest.java @@ -114,6 +114,26 @@ public void dateDiff() { assertEquals(-1572, ScalarOperatorFunctions.dateDiff(O_DT_20101202_023010, O_DT_20150323_092355).getInt()); } + @Test + public void to_days() { + assertEquals(734443, ScalarOperatorFunctions.to_days(O_DT_20101102_183010).getInt()); + } + + @Test + public void dayofweek() { + ConstantOperator testDate = ConstantOperator.createDatetime(LocalDateTime.of(2024, 2, 3, 13, 4, 5)); + assertEquals(7, + ScalarOperatorFunctions.dayofweek(testDate).getInt()); + + testDate = ConstantOperator.createDatetime(LocalDateTime.of(2024, 2, 4, 13, 4, 5)); + assertEquals(1, + ScalarOperatorFunctions.dayofweek(testDate).getInt()); + + testDate = ConstantOperator.createDatetime(LocalDateTime.of(2024, 2, 5, 13, 4, 5)); + assertEquals(2, + ScalarOperatorFunctions.dayofweek(testDate).getInt()); + } + @Test public void yearsAdd() { assertEquals("2025-03-23T09:23:55",