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

huajianlan 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 f6071a3833b [enhance](nereids) date_add, date_sub, date_diff, 
date_floor, date_ceil function implement Monotonic (#44943)
f6071a3833b is described below

commit f6071a3833bb095f01065a9d10bc828f59cac883
Author: feiniaofeiafei <moail...@selectdb.com>
AuthorDate: Sat Dec 21 18:00:07 2024 +0800

    [enhance](nereids) date_add, date_sub, date_diff, date_floor, date_ceil 
function implement Monotonic (#44943)
    
    date_add, date_sub, date_diff, date_floor, date_ceil function implement 
Monotonic, so we can do prune range partition for this functions, for example 
`date_add(dt, 1) = '2024-01-01'`
---
 .../rules/OneRangePartitionEvaluator.java          |  15 +-
 .../{Monotonic.java => DateAddSubMonotonic.java}   |  27 +-
 ...{Monotonic.java => DateCeilFloorMonotonic.java} |  36 +-
 .../{Monotonic.java => DateDiffMonotonic.java}     |  28 +-
 .../trees/expressions/functions/Monotonic.java     |   5 +
 .../expressions/functions/scalar/DayCeil.java      |  17 +-
 .../expressions/functions/scalar/DayFloor.java     |  17 +-
 .../expressions/functions/scalar/DaysAdd.java      |   8 +-
 .../expressions/functions/scalar/DaysDiff.java     |  13 +-
 .../expressions/functions/scalar/DaysSub.java      |   8 +-
 .../expressions/functions/scalar/FromDays.java     |  18 +-
 .../expressions/functions/scalar/HourCeil.java     |  17 +-
 .../expressions/functions/scalar/HourFloor.java    |  17 +-
 .../expressions/functions/scalar/HoursAdd.java     |   9 +-
 .../expressions/functions/scalar/HoursDiff.java    |  13 +-
 .../expressions/functions/scalar/HoursSub.java     |   9 +-
 .../functions/scalar/MicroSecondsAdd.java          |   9 +-
 .../functions/scalar/MicroSecondsDiff.java         |  13 +-
 .../functions/scalar/MicroSecondsSub.java          |   9 +-
 .../functions/scalar/MilliSecondsAdd.java          |   9 +-
 .../functions/scalar/MilliSecondsDiff.java         |  13 +-
 .../functions/scalar/MilliSecondsSub.java          |   9 +-
 .../expressions/functions/scalar/MinuteCeil.java   |  17 +-
 .../expressions/functions/scalar/MinuteFloor.java  |  17 +-
 .../expressions/functions/scalar/MinutesAdd.java   |   9 +-
 .../expressions/functions/scalar/MinutesDiff.java  |  13 +-
 .../expressions/functions/scalar/MinutesSub.java   |   9 +-
 .../expressions/functions/scalar/MonthCeil.java    |  17 +-
 .../expressions/functions/scalar/MonthFloor.java   |  17 +-
 .../expressions/functions/scalar/MonthsAdd.java    |   8 +-
 .../expressions/functions/scalar/MonthsDiff.java   |  13 +-
 .../expressions/functions/scalar/MonthsSub.java    |   8 +-
 .../expressions/functions/scalar/SecondCeil.java   |  17 +-
 .../expressions/functions/scalar/SecondFloor.java  |  17 +-
 .../expressions/functions/scalar/SecondsAdd.java   |   9 +-
 .../expressions/functions/scalar/SecondsDiff.java  |  13 +-
 .../expressions/functions/scalar/SecondsSub.java   |   9 +-
 .../functions/scalar/UnixTimestamp.java            |  39 +-
 .../expressions/functions/scalar/YearCeil.java     |  17 +-
 .../expressions/functions/scalar/YearFloor.java    |  17 +-
 .../expressions/functions/scalar/YearsAdd.java     |   8 +-
 .../expressions/functions/scalar/YearsDiff.java    |  13 +-
 .../expressions/functions/scalar/YearsSub.java     |   8 +-
 .../trees/expressions/literal/DateTimeLiteral.java |   5 +-
 .../test_add_sub_diff_ceil_floor.groovy            | 407 +++++++++++++++++++++
 .../partition_prune/test_convert_tz.groovy         |   6 +-
 46 files changed, 950 insertions(+), 82 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
index 7e91d5502f7..eb9fd6e1491 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
@@ -48,6 +48,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.Nullable;
 import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.literal.MaxLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BooleanType;
 import org.apache.doris.nereids.util.ExpressionUtils;
@@ -807,22 +808,29 @@ public class OneRangePartitionEvaluator<K>
                 : new NonNullable(funcChild));
         partitionSlotContainsNull.put((Expression) func, 
withNullable.nullable());
 
-        if (!result.childrenResult.get(0).columnRanges.containsKey(funcChild)) 
{
+        if 
(!result.childrenResult.get(childIndex).columnRanges.containsKey(funcChild)) {
             return result;
         }
-        ColumnRange childRange = 
result.childrenResult.get(0).columnRanges.get(funcChild);
+        ColumnRange childRange = 
result.childrenResult.get(childIndex).columnRanges.get(funcChild);
         if (childRange.isEmptyRange() || childRange.asRanges().size() != 1
                 || (!childRange.span().hasLowerBound() && 
!childRange.span().hasUpperBound())) {
             return result;
         }
         Range<ColumnBound> span = childRange.span();
+        // null means positive infinity or negative infinity
         Literal lower = span.hasLowerBound() ? span.lowerEndpoint().getValue() 
: null;
         Literal upper = span.hasUpperBound() && 
!(span.upperEndpoint().getValue() instanceof MaxLiteral)
                 ? span.upperEndpoint().getValue() : null;
+        if (!func.isMonotonic(lower, upper)) {
+            return result;
+        }
         Expression lowerValue = lower != null ? 
FoldConstantRuleOnFE.evaluate(func.withConstantArgs(lower),
                 expressionRewriteContext) : null;
         Expression upperValue = upper != null ? 
FoldConstantRuleOnFE.evaluate(func.withConstantArgs(upper),
                 expressionRewriteContext) : null;
+        if (lowerValue instanceof NullLiteral || upperValue instanceof 
NullLiteral) {
+            return result;
+        }
         if (!func.isPositive()) {
             Expression temp = lowerValue;
             lowerValue = upperValue;
@@ -842,6 +850,9 @@ public class OneRangePartitionEvaluator<K>
             if (upperValue instanceof Literal) {
                 newRange = newRange.withUpperBound((Literal) upperValue);
             }
+            if (newRange.isEmptyRange() || !newRange.span().hasLowerBound() && 
!newRange.span().hasUpperBound()) {
+                return result;
+            }
             context.rangeMap.put((Expression) func, newRange);
             newRanges.put((Expression) func, newRange);
             return new EvaluateRangeResult((Expression) func, newRanges, 
result.childrenResult);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateAddSubMonotonic.java
similarity index 57%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateAddSubMonotonic.java
index bcaa040cb2a..7fec22fd9d3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateAddSubMonotonic.java
@@ -17,19 +17,22 @@
 
 package org.apache.doris.nereids.trees.expressions.functions;
 
-import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 
-/** monotonicity of expressions */
-public interface Monotonic extends ExpressionTrait {
-    // true means that the function is an increasing function
-    boolean isPositive();
+/** monotonicity for XX_ADD XX_SUB */
+public interface DateAddSubMonotonic extends Monotonic {
+    @Override
+    default boolean isMonotonic(Literal lower, Literal upper) {
+        return child(1) instanceof Literal;
+    }
 
-    // return the range input child index
-    // e.g. date_trunc(dt,'xxx') return 0
-    int getMonotonicFunctionChildIndex();
+    @Override
+    default boolean isPositive() {
+        return true;
+    }
 
-    // return the function with the arguments replaced by literal
-    // e.g. date_trunc(dt, 'day'), dt in range ['2020-01-01 10:00:00', 
'2020-01-03 10:00:00']
-    // return date_trunc('2020-01-01 10:00:00', 'day')
-    Expression withConstantArgs(Expression literal);
+    @Override
+    default int getMonotonicFunctionChildIndex() {
+        return 0;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateCeilFloorMonotonic.java
similarity index 52%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateCeilFloorMonotonic.java
index bcaa040cb2a..71ad80a3471 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateCeilFloorMonotonic.java
@@ -17,19 +17,31 @@
 
 package org.apache.doris.nereids.trees.expressions.functions;
 
-import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 
-/** monotonicity of expressions */
-public interface Monotonic extends ExpressionTrait {
-    // true means that the function is an increasing function
-    boolean isPositive();
+/** monotonicity of XX_CEIL and XX_FLOOR */
+public interface DateCeilFloorMonotonic extends Monotonic {
+    @Override
+    default boolean isMonotonic(Literal lower, Literal upper) {
+        switch (arity()) {
+            case 1:
+                return true;
+            case 2:
+                return !(child(0) instanceof Literal) && child(1) instanceof 
Literal;
+            case 3:
+                return !(child(0) instanceof Literal) && child(1) instanceof 
Literal && child(2) instanceof Literal;
+            default:
+                return false;
+        }
+    }
 
-    // return the range input child index
-    // e.g. date_trunc(dt,'xxx') return 0
-    int getMonotonicFunctionChildIndex();
+    @Override
+    default boolean isPositive() {
+        return true;
+    }
 
-    // return the function with the arguments replaced by literal
-    // e.g. date_trunc(dt, 'day'), dt in range ['2020-01-01 10:00:00', 
'2020-01-03 10:00:00']
-    // return date_trunc('2020-01-01 10:00:00', 'day')
-    Expression withConstantArgs(Expression literal);
+    @Override
+    default int getMonotonicFunctionChildIndex() {
+        return 0;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateDiffMonotonic.java
similarity index 57%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
copy to 
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateDiffMonotonic.java
index bcaa040cb2a..daaea895b6d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/DateDiffMonotonic.java
@@ -17,19 +17,23 @@
 
 package org.apache.doris.nereids.trees.expressions.functions;
 
-import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 
-/** monotonicity of expressions */
-public interface Monotonic extends ExpressionTrait {
-    // true means that the function is an increasing function
-    boolean isPositive();
+/** monotonicity for XX_DIFF */
+public interface DateDiffMonotonic extends Monotonic {
+    @Override
+    default boolean isMonotonic(Literal lower, Literal upper) {
+        return !(child(0) instanceof Literal) && child(1) instanceof Literal
+                || child(0) instanceof Literal && !(child(1) instanceof 
Literal);
+    }
 
-    // return the range input child index
-    // e.g. date_trunc(dt,'xxx') return 0
-    int getMonotonicFunctionChildIndex();
+    @Override
+    default boolean isPositive() {
+        return child(1) instanceof Literal;
+    }
 
-    // return the function with the arguments replaced by literal
-    // e.g. date_trunc(dt, 'day'), dt in range ['2020-01-01 10:00:00', 
'2020-01-03 10:00:00']
-    // return date_trunc('2020-01-01 10:00:00', 'day')
-    Expression withConstantArgs(Expression literal);
+    @Override
+    default int getMonotonicFunctionChildIndex() {
+        return child(1) instanceof Literal ? 0 : 1;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
index bcaa040cb2a..feec5933890 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Monotonic.java
@@ -18,9 +18,14 @@
 package org.apache.doris.nereids.trees.expressions.functions;
 
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 
 /** monotonicity of expressions */
 public interface Monotonic extends ExpressionTrait {
+    default boolean isMonotonic(Literal lower, Literal upper) {
+        return true;
+    }
+
     // true means that the function is an increasing function
     boolean isPositive();
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayCeil.java
index e77c307b523..740363b50aa 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +38,7 @@ import java.util.List;
  * ScalarFunction 'day_ceil'. This class is generated by GenerateFunction.
  */
 public class DayCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -106,4 +107,18 @@ public class DayCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDayCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new DayCeil(literal);
+            case 2:
+                return new DayCeil(literal, child(1));
+            case 3:
+                return new DayCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayFloor.java
index b7e04e3a374..5ba7fc13c75 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +38,7 @@ import java.util.List;
  * ScalarFunction 'day_floor'. This class is generated by GenerateFunction.
  */
 public class DayFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -106,4 +107,18 @@ public class DayFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDayFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new DayFloor(literal);
+            case 2:
+                return new DayFloor(literal, child(1));
+            case 3:
+                return new DayFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysAdd.java
index e02c20eee82..a231816a330 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysAdd.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class DaysAdd extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
     private static final List<FunctionSignature> SIGNATURES = 
Config.enable_date_conversion ? ImmutableList.of(
@@ -77,4 +78,9 @@ public class DaysAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDaysAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new DaysAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysDiff.java
index e0343f1148f..c6f3377fdc9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'days_diff'. This class is generated by GenerateFunction.
  */
 public class DaysDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -73,4 +75,13 @@ public class DaysDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDaysDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new DaysDiff(literal, child(1));
+        } else {
+            return new DaysDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysSub.java
index 8d135dc6c9c..5dab58ecdf6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DaysSub.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class DaysSub extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
     private static final List<FunctionSignature> SIGNATURES = 
Config.enable_date_conversion ? ImmutableList.of(
@@ -77,4 +78,9 @@ public class DaysSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDaysSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new DaysSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromDays.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromDays.java
index c3d19588ce5..1799c1461fc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromDays.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromDays.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.Monotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'from_days'. This class is generated by GenerateFunction.
  */
 public class FromDays extends ScalarFunction
-        implements UnaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable, PropagateNullLiteral {
+        implements UnaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable, PropagateNullLiteral, Monotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateV2Type.INSTANCE).args(IntegerType.INSTANCE)
@@ -67,4 +68,19 @@ public class FromDays extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitFromDays(this, context);
     }
+
+    @Override
+    public boolean isPositive() {
+        return true;
+    }
+
+    @Override
+    public int getMonotonicFunctionChildIndex() {
+        return 0;
+    }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new FromDays(literal);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourCeil.java
index e76151ef9d6..13358e18d74 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'hour_ceil'. This class is generated by GenerateFunction.
  */
 public class HourCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -100,4 +101,18 @@ public class HourCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitHourCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new HourCeil(literal);
+            case 2:
+                return new HourCeil(literal, child(1));
+            case 3:
+                return new HourCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourFloor.java
index 567f0a2dd18..f48e26ea443 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HourFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'hour_floor'. This class is generated by GenerateFunction.
  */
 public class HourFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -100,4 +101,18 @@ public class HourFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitHourFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new HourFloor(literal);
+            case 2:
+                return new HourFloor(literal, child(1));
+            case 3:
+                return new HourFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursAdd.java
index cb4e601b14d..4c10b204597 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursAdd.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'days_add'.
  */
 public class HoursAdd extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class HoursAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitHoursAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new HoursAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursDiff.java
index 452e3110ff7..63942cd56e9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'hours_diff'. This class is generated by GenerateFunction.
  */
 public class HoursDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -73,4 +75,13 @@ public class HoursDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitHoursDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new HoursDiff(literal, child(1));
+        } else {
+            return new HoursDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursSub.java
index e53f8ecb905..49e8e5cb50f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/HoursSub.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'hours_sub'.
  */
 public class HoursSub extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class HoursSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitHoursSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new HoursSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsAdd.java
index 8d792259440..33dd5809f2b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsAdd.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -35,7 +36,8 @@ import java.util.List;
  * ScalarFunction 'MicroSeconds_add'.
  */
 public class MicroSecondsAdd extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.MAX)
@@ -66,4 +68,9 @@ public class MicroSecondsAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMicroSecondsAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MicroSecondsAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsDiff.java
index 8bf3a964839..160e8a96b13 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -35,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'microseconds_diff'. This class is generated by 
GenerateFunction.
  */
 public class MicroSecondsDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -67,4 +69,13 @@ public class MicroSecondsDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMicroSecondsDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new MicroSecondsDiff(literal, child(1));
+        } else {
+            return new MicroSecondsDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsSub.java
index 2894d1fffc9..20c880fb879 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MicroSecondsSub.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -35,7 +36,8 @@ import java.util.List;
  * ScalarFunction 'MicroSeconds_sub'.
  */
 public class MicroSecondsSub extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.MAX)
@@ -66,4 +68,9 @@ public class MicroSecondsSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMicroSecondsSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MicroSecondsSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsAdd.java
index 1cb56b13f84..244b661db3a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsAdd.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -35,7 +36,8 @@ import java.util.List;
  * ScalarFunction 'MilliSeconds_add'.
  */
 public class MilliSecondsAdd extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.MAX)
@@ -66,4 +68,9 @@ public class MilliSecondsAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMilliSecondsAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MilliSecondsAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsDiff.java
index 4500bd69460..0e8c623ce17 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -35,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'milliseconds_diff'. This class is generated by 
GenerateFunction.
  */
 public class MilliSecondsDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -67,4 +69,13 @@ public class MilliSecondsDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMilliSecondsDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new MilliSecondsDiff(literal, child(1));
+        } else {
+            return new MilliSecondsDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsSub.java
index 42891b7e7e0..10b4f8184d1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MilliSecondsSub.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -35,7 +36,8 @@ import java.util.List;
  * ScalarFunction 'MilliSeconds_sub'.
  */
 public class MilliSecondsSub extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.MAX)
@@ -66,4 +68,9 @@ public class MilliSecondsSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMilliSecondsSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MilliSecondsSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteCeil.java
index b00eaff07c2..4f3e317d00e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -35,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'minute_ceil'. This class is generated by GenerateFunction.
  */
 public class MinuteCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -99,4 +100,18 @@ public class MinuteCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMinuteCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new MinuteCeil(literal);
+            case 2:
+                return new MinuteCeil(literal, child(1));
+            case 3:
+                return new MinuteCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteFloor.java
index 683acc3a483..cefb5222c76 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinuteFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -35,7 +36,7 @@ import java.util.List;
  * ScalarFunction 'minute_floor'. This class is generated by GenerateFunction.
  */
 public class MinuteFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -99,4 +100,18 @@ public class MinuteFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMinuteFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new MinuteFloor(literal);
+            case 2:
+                return new MinuteFloor(literal, child(1));
+            case 3:
+                return new MinuteFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesAdd.java
index f4c02fb84ca..8ba1642f624 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesAdd.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'minutes_add'.
  */
 public class MinutesAdd extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class MinutesAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMinutesAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MinutesAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
index 4d011116334..91c254be7c1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'minutes_diff'. This class is generated by GenerateFunction.
  */
 public class MinutesDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -73,4 +75,13 @@ public class MinutesDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMinutesDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new MinutesDiff(literal, child(1));
+        } else {
+            return new MinutesDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesSub.java
index 4fb61695781..2a29d9e1659 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesSub.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'minutes_sub'.
  */
 public class MinutesSub extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class MinutesSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMinutesSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MinutesSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthCeil.java
index 627568cf28a..a1f4628dd6a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +38,7 @@ import java.util.List;
  * ScalarFunction 'month_ceil'. This class is generated by GenerateFunction.
  */
 public class MonthCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -106,4 +107,18 @@ public class MonthCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMonthCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new MonthCeil(literal);
+            case 2:
+                return new MonthCeil(literal, child(1));
+            case 3:
+                return new MonthCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthFloor.java
index f3b0b66c139..d55d52ab68c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -37,7 +38,7 @@ import java.util.List;
  * ScalarFunction 'month_floor'. This class is generated by GenerateFunction.
  */
 public class MonthFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -106,4 +107,18 @@ public class MonthFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMonthFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new MonthFloor(literal);
+            case 2:
+                return new MonthFloor(literal, child(1));
+            case 3:
+                return new MonthFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsAdd.java
index 5126400b71e..1cca6d8446f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsAdd.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class MonthsAdd extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
 
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class MonthsAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMonthsAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MonthsAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsDiff.java
index 373265b1e38..a850767a49f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'months_diff'. This class is generated by GenerateFunction.
  */
 public class MonthsDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).args(DateV2Type.INSTANCE, 
DateV2Type.INSTANCE),
@@ -73,4 +75,13 @@ public class MonthsDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMonthsDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new MonthsDiff(literal, child(1));
+        } else {
+            return new MonthsDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsSub.java
index 1c2985a6e13..9c5824a1b9e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MonthsSub.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class MonthsSub extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
 
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class MonthsSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitMonthsSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new MonthsSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondCeil.java
index 04cd08f4c8c..3b0e6576987 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'second_ceil'. This class is generated by GenerateFunction.
  */
 public class SecondCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -100,4 +101,18 @@ public class SecondCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitSecondCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new SecondCeil(literal);
+            case 2:
+                return new SecondCeil(literal, child(1));
+            case 3:
+                return new SecondCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondFloor.java
index ae0af110607..c06fff06aed 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'second_floor'. This class is generated by GenerateFunction.
  */
 public class SecondFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
PropagateNullLiteral, DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -101,4 +102,18 @@ public class SecondFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitSecondFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new SecondFloor(literal);
+            case 2:
+                return new SecondFloor(literal, child(1));
+            case 3:
+                return new SecondFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsAdd.java
index a6e131f5263..3afa8f13419 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsAdd.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'minutes_add'.
  */
 public class SecondsAdd extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class SecondsAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitSecondsAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new SecondsAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsDiff.java
index 4dd7e12b9e2..c81999d4fa2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'seconds_diff'. This class is generated by GenerateFunction.
  */
 public class SecondsDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
@@ -73,4 +75,13 @@ public class SecondsDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitSecondsDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new SecondsDiff(literal, child(1));
+        } else {
+            return new SecondsDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsSub.java
index 37c59b2168b..d3093f84e1a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/SecondsSub.java
@@ -19,6 +19,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -38,7 +39,8 @@ import java.util.List;
  * ScalarFunction 'Seconds_sub'.
  */
 public class SecondsSub extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args,
+        DateAddSubMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -67,4 +69,9 @@ public class SecondsSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitSecondsSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new SecondsSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
index 633e1e7d4f3..178187ad9cb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
@@ -20,6 +20,9 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.Monotonic;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -39,7 +42,8 @@ import java.util.List;
 /**
  * ScalarFunction 'unix_timestamp'. This class is generated by 
GenerateFunction.
  */
-public class UnixTimestamp extends ScalarFunction implements 
ExplicitlyCastableSignature {
+public class UnixTimestamp extends ScalarFunction implements 
ExplicitlyCastableSignature, Monotonic {
+    private static final DateTimeLiteral MAX = new DateTimeLiteral("2038-01-19 
03:14:07");
 
     // we got changes when computeSignature
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
@@ -145,4 +149,37 @@ public class UnixTimestamp extends ScalarFunction 
implements ExplicitlyCastableS
     public boolean isDeterministic() {
         return !this.children.isEmpty();
     }
+
+    @Override
+    public boolean isPositive() {
+        return true;
+    }
+
+    @Override
+    public int getMonotonicFunctionChildIndex() {
+        return 0;
+    }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new UnixTimestamp(literal);
+    }
+
+    @Override
+    public boolean isMonotonic(Literal lower, Literal upper) {
+        if (arity() != 1) {
+            return false;
+        }
+        if (null == lower) {
+            lower = DateTimeLiteral.MIN_DATETIME;
+        }
+        if (null == upper) {
+            upper = DateTimeLiteral.MAX_DATETIME;
+        }
+        if (lower.compareTo(MAX) <= 0 && upper.compareTo(MAX) > 0) {
+            return false;
+        } else {
+            return true;
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearCeil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearCeil.java
index bc294638be9..37c952af815 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearCeil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearCeil.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'year_ceil'. This class is generated by GenerateFunction.
  */
 public class YearCeil extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -105,4 +106,18 @@ public class YearCeil extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitYearCeil(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new YearCeil(literal);
+            case 2:
+                return new YearCeil(literal, child(1));
+            case 3:
+                return new YearCeil(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearFloor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearFloor.java
index 5415502a769..00a1ad918f7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearFloor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearFloor.java
@@ -20,6 +20,7 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateCeilFloorMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -36,7 +37,7 @@ import java.util.List;
  * ScalarFunction 'year_floor'. This class is generated by GenerateFunction.
  */
 public class YearFloor extends ScalarFunction
-        implements ExplicitlyCastableSignature, AlwaysNullable {
+        implements ExplicitlyCastableSignature, AlwaysNullable, 
DateCeilFloorMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -105,4 +106,18 @@ public class YearFloor extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitYearFloor(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        switch (arity()) {
+            case 1:
+                return new YearFloor(literal);
+            case 2:
+                return new YearFloor(literal, child(1));
+            case 3:
+                return new YearFloor(literal, child(1), child(2));
+            default:
+                throw new IllegalStateException("The function " + getName() + 
" has invalid child number.");
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsAdd.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsAdd.java
index 33c9e1c6dfa..9b81378d987 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsAdd.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsAdd.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class YearsAdd extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
 
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class YearsAdd extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitYearsAdd(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new YearsAdd(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsDiff.java
index e217d8da729..61b637449f1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsDiff.java
@@ -19,8 +19,10 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.DateDiffMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -37,7 +39,7 @@ import java.util.List;
  * ScalarFunction 'years_diff'. This class is generated by GenerateFunction.
  */
 public class YearsDiff extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
 
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).args(DateV2Type.INSTANCE, 
DateV2Type.INSTANCE),
@@ -73,4 +75,13 @@ public class YearsDiff extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitYearsDiff(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        if (child(1) instanceof Literal) {
+            return new YearsDiff(literal, child(1));
+        } else {
+            return new YearsDiff(child(0), literal);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsSub.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsSub.java
index b70444178df..6f46727d937 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsSub.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearsSub.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Config;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import 
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
  */
 public class YearsSub extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature,
-        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+        ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args, 
DateAddSubMonotonic {
 
     // When enable_date_conversion is true, we prefer to V2 signature.
     // This preference follows original planner. refer to 
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class YearsSub extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitYearsSub(this, context);
     }
+
+    @Override
+    public Expression withConstantArgs(Expression literal) {
+        return new YearsSub(literal, child(1));
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
index 27470187eae..0a5c02409c1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
@@ -43,11 +43,10 @@ import java.util.Objects;
  * date time literal.
  */
 public class DateTimeLiteral extends DateLiteral {
+    public static final DateTimeLiteral MIN_DATETIME = new 
DateTimeLiteral(0000, 1, 1, 0, 0, 0);
+    public static final DateTimeLiteral MAX_DATETIME = new 
DateTimeLiteral(9999, 12, 31, 23, 59, 59);
     protected static final int MAX_MICROSECOND = 999999;
 
-    private static final DateTimeLiteral MIN_DATETIME = new 
DateTimeLiteral(0000, 1, 1, 0, 0, 0);
-    private static final DateTimeLiteral MAX_DATETIME = new 
DateTimeLiteral(9999, 12, 31, 23, 59, 59);
-
     private static final Logger LOG = 
LogManager.getLogger(DateTimeLiteral.class);
 
     protected long hour;
diff --git 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
new file mode 100644
index 00000000000..bda9dc81af7
--- /dev/null
+++ 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
@@ -0,0 +1,407 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_add_sub_diff_ceil_floor") {
+    sql "set disable_nereids_rules='REWRITE_FILTER_EXPRESSION'"
+    sql "drop table if exists test_add_sub_diff_ceil_floor_t"
+    sql """create table test_add_sub_diff_ceil_floor_t (a int, dt datetime, d 
date, c varchar(100)) duplicate key(a)
+    partition by range(dt) (
+            partition p1 values less than ("2017-01-01"),
+            partition p2 values less than ("2018-01-01"),
+            partition p3 values less than ("2019-01-01"),
+            partition p4 values less than ("2020-01-01"),
+            partition p5 values less than ("2021-01-01")
+    ) distributed by hash(a) properties("replication_num"="1");"""
+    sql """INSERT INTO test_add_sub_diff_ceil_floor_t SELECT number,
+    date_add('2016-01-01 00:00:00', interval number month),
+    cast(date_add('2022-01-01 00:00:00', interval number month) as date), 
cast(number as varchar(65533)) FROM numbers('number'='55');"""
+    sql "INSERT INTO test_add_sub_diff_ceil_floor_t  values(3,null,null,null);"
+
+    // xx_add
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_add(dt,1) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_add(dt,2) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
days_add(dt,10) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hours_add(dt,1) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minutes_add(dt,2) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
seconds_add(dt,10) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
milliseconds_add(dt,2) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
microseconds_add(dt,10) >'2019-01-01' """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    // xx_sub
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_sub(dt,1) <='2018-01-01' """
+        contains("4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_sub(dt,2) <='2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
days_sub(dt,10) <='2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hours_sub(dt,1) <='2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minutes_sub(dt,2) <= '2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
seconds_sub(dt,10) <= '2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
milliseconds_sub(dt,2) <= '2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
microseconds_sub(dt,10) <= '2018-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+
+    // xx_diff
+    // first arg is dt. positive
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_diff(dt,'2017-01-01') <2 """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
days_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hours_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minutes_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
seconds_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
milliseconds_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
microseconds_diff(dt,'2017-01-01') <2 """
+        contains("partitions=2/5 (p1,p2)")
+    }
+    // second arg is dt. not positive
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',dt) <2 """
+        contains("partitions=2/5 (p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
days_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hours_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minutes_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
seconds_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
milliseconds_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
microseconds_diff('2021-01-01',dt) <2 """
+        contains("partitions=1/5 (p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',dt) <=2 """
+        contains("partitions=3/5 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_diff('2020-01-01',dt) >2 """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
days_diff('2020-01-01',dt) >=2 """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+
+    // xx_ceil
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
year_ceil(dt) <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
month_ceil(dt) <'2019-02-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where day_ceil(dt) 
<'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hour_ceil(dt) <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minute_ceil(dt) <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
second_ceil(dt) <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    // xx_ceil with other args
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
year_ceil(dt,5) <'2019-01-01' """
+        contains("partitions=1/5 (p1)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
year_ceil(dt,'2013-01-01') <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
year_ceil(dt,5,'2013-01-01') <'2019-01-01'"""
+        contains(" partitions=3/5 (p1,p2,p3)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hour_ceil(dt,c) <'2019-01-01' """
+        contains("partitions=5/5 (p1,p2,p3,p4,p5)")
+    }
+
+    // xx_floor
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
year_floor(dt) <='2019-01-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
month_floor(dt) <='2019-02-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
day_floor(dt) <='2019-01-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hour_floor(dt) <='2019-01-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
minute_floor(dt) <='2019-01-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
second_floor(dt) <'2019-01-01' """
+        contains("partitions=3/5 (p1,p2,p3)")
+    }
+
+    // xx_floor with other args
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
month_floor(dt,'2015-01-01') <='2019-02-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
month_floor(dt,5,'2015-01-01') <='2019-02-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
month_floor(dt,5) <='2019-02-01' """
+        contains("partitions=4/5 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hour_floor(dt,c,'2015-01-01') <='2019-01-01' """
+        contains("partitions=5/5 (p1,p2,p3,p4,p5)")
+    }
+
+    // diff nest function
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',month_ceil(hours_add(dt, 1))) <=2 """
+        contains("partitions=4/5 (p2,p3,p4,p5)")
+    }
+    explain  {
+        sql "select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',month_ceil(hours_sub(dt, 1))) <=2"
+        contains("partitions=4/5 (p1,p3,p4,p5)")
+    }
+    // mixed with non-function predicates
+    explain {
+        sql "select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',month_ceil(hours_sub(dt, 1))) <=2 and dt>'2019-06-01'"
+        contains("partitions=2/5 (p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
years_diff('2021-01-01',month_ceil(hours_sub(dt, 1))) <=2 and 
date_trunc(dt,'day')>'2019-06-01' """
+        contains("partitions=2/5 (p4,p5)")
+    }
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
months_diff(months_add(dt,10), '2018-01-01') =2 """
+        contains("partitions=1/5 (p2)")
+    }
+
+    // hours_add second arg is not literal, so will not do pruning
+    explain {
+        sql """select * from test_add_sub_diff_ceil_floor_t where 
hours_add(dt, years_diff(dt,'2018-01-01')) <'2018-01-01' """
+        contains("partitions=5/5 (p1,p2,p3,p4,p5)")
+    }
+
+    // max
+    sql "drop table if exists max_t"
+    sql """create table max_t (a int, dt datetime, d date, c varchar(100)) 
duplicate key(a)
+    partition by range(dt) (
+            partition p1 values less than ("2017-01-01"),
+            partition p2 values less than ("2018-01-01"),
+            partition p3 values less than ("2019-01-01"),
+            partition p4 values less than ("2020-01-01"),
+            partition p5 values less than ("2021-01-01"),
+            partition p6 values less than MAXVALUE
+    ) distributed by hash(a) properties("replication_num"="1");"""
+    sql """INSERT INTO max_t SELECT number,
+    date_add('2016-01-01 00:00:00', interval number month),
+    cast(date_add('2022-01-01 00:00:00', interval number month) as date), 
cast(number as varchar(65533)) FROM numbers('number'='100');"""
+    sql "INSERT INTO max_t  values(3,null,null,null);"
+
+    explain {
+        sql "select * from max_t where 
years_diff('2021-01-01',month_ceil(hours_add(dt, 1),'1990-01-05')) <=2 ;"
+        contains("partitions=5/6 (p2,p3,p4,p5,p6)")
+    }
+    explain {
+        sql "select * from max_t where 
years_diff('2021-01-01',month_ceil(hours_add(dt, 1),10,'1990-01-05')) <=2 ;"
+        contains("partitions=5/6 (p2,p3,p4,p5,p6)")
+    }
+
+    explain {
+        sql """select * from max_t where 
years_diff('2021-01-01',month_ceil(hours_add(dt, 1),10,'1990-01-05')) <=2 and 
dt >'2018-01-01';"""
+        contains("partitions=4/6 (p3,p4,p5,p6)")
+    }
+
+    explain {
+        sql """select * from max_t where 
months_diff('2021-01-01',month_floor(hours_add(dt, 1),10,'1990-01-05')) <=2;"""
+        contains("partitions=3/6 (p1,p5,p6)")
+    }
+
+    explain {
+        sql """select * from max_t where 
months_diff('2021-01-01',month_floor(hours_add(dt, 1),12,'1000-01-01')) > 2"""
+        contains("partitions=5/6 (p1,p2,p3,p4,p5)")
+    }
+    explain {
+        sql """select * from max_t where 
months_diff('2021-01-01',month_floor(hours_add(dt, 1),12,'1000-01-01')) > 2 and 
month_floor(dt) >'2018-01-01' """
+        contains("partitions=3/6 (p3,p4,p5)")
+    }
+    explain {
+        sql """select * from max_t where hours_sub(hours_add(dt, 1),1) 
>'2018-01-01' and days_diff(hours_sub(hours_add(dt, 1),1),'2021-01-01') >2"""
+        contains("partitions=1/6 (p6)")
+    }
+
+    // from_days and unix_timestamp
+    explain {
+        sql """select * from max_t where unix_timestamp(dt) > 1547838847 """
+        contains("partitions=3/6 (p4,p5,p6)")
+    }
+
+    sql "drop table if exists partition_int_from_days"
+    sql """
+    CREATE TABLE `partition_int_from_days` (
+      `a` int NULL,
+      `b` int NULL
+    ) ENGINE=OLAP
+    DUPLICATE KEY(`a`, `b`)
+    PARTITION BY RANGE(`a`)
+    (PARTITION p1 VALUES [("-2147483648"), ("100000")),
+    PARTITION p2 VALUES [("100000"), ("738000")),
+    PARTITION p3 VALUES [("738000"), ("90000000")),
+    PARTITION p4 VALUES [("90000000"), (MAXVALUE)))
+    DISTRIBUTED BY HASH(`a`) BUCKETS 10
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1"
+    ); """
+    sql """
+    insert into partition_int_from_days 
values(100,100),(100022,1002),(738004,33),(90000003,89);
+    """
+    explain {
+        sql """select * from partition_int_from_days where 
from_days(a)>'2020-07-29' """
+        contains("partitions=3/4 (p1,p3,p4)")
+    }
+
+
+    sql "drop table if exists unix_time_t"
+    sql """create table unix_time_t (a int, dt datetime, d date, c 
varchar(100)) duplicate key(a)
+    partition by range(dt) (
+            partition p1 values less than ("1980-01-01"),
+            partition p2 values less than ("2018-01-01"),
+            partition p3 values less than ("2039-01-01"),
+            partition p4 values less than MAXVALUE
+    ) distributed by hash(a) properties("replication_num"="1");"""
+    sql """INSERT INTO unix_time_t 
values(1,'1979-01-01','1979-01-01','abc'),(1,'2012-01-01','2012-01-01','abc'),(1,'2020-01-01','2020-01-01','abc'),(1,'2045-01-01','2045-01-01','abc')"""
+    sql "INSERT INTO unix_time_t  values(3,null,null,null);"
+    explain {
+        sql """ select * from unix_time_t where unix_timestamp(dt) > 
1514822400 """
+        contains("partitions=2/4 (p3,p4)")
+    }
+    explain {
+        sql """select * from unix_time_t where unix_timestamp(dt) < 
2147454847;"""
+        contains("partitions=4/4 (p1,p2,p3,p4)")
+    }
+    explain {
+        sql """select * from unix_time_t where unix_timestamp(dt) = 
2147454847"""
+        contains("partitions=2/4 (p3,p4)")
+    }
+    explain {
+        sql """select * from unix_time_t where unix_timestamp(dt) = 2147454847 
and dt<'2038-01-01'"""
+        contains("partitions=1/4 (p3)")
+    }
+    explain {
+        sql """select * from unix_time_t where unix_timestamp(dt) <=0"""
+        contains("partitions=3/4 (p1,p3,p4)")
+    }
+
+}
\ No newline at end of file
diff --git 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
index c309d10d067..3e033a78eb9 100644
--- 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
@@ -46,13 +46,13 @@ suite("test_convert_tz") {
     }
     explain {
         sql "SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') > '2021-01-01';";
-        contains("partitions=2/3 (p2,p3)")
+        contains("partitions=3/3 (p1,p2,p3)")
     }
 
     explain {
         sql """SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') < '2021-02-24'
         and convert_tz(timestamp, 'Asia/Shanghai', 'Europe/Paris') > 
'2021-01-01';"""
-        contains("partitions=2/3 (p2,p3)")
+        contains("partitions=3/3 (p1,p2,p3)")
     }
 
     explain {
@@ -93,7 +93,7 @@ suite("test_convert_tz") {
         }
         explain {
             sql "SELECT * FROM test_convert_tz WHERE not convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') <= '2021-01-01';";
-            contains("partitions=2/3 (p2,p3)")
+            contains("partitions=3/3 (p1,p2,p3)")
         }
     }
 }
\ No newline at end of file


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

Reply via email to