diff --git a/mysql-test/main/func_extract.result b/mysql-test/main/func_extract.result
index 7c1fd5009ca..5c651d713ea 100644
--- a/mysql-test/main/func_extract.result
+++ b/mysql-test/main/func_extract.result
@@ -1478,5 +1478,30 @@ NULL
 Warnings:
 Warning	1292	Incorrect interval value: '42949672955000x1'
 #
+# MDEV-23687 Assertion `is_valid_value_slow()' failed in Datetime::Datetime upon EXTRACT under mode ZERO_DATE_TIME_CAST
+#
+SET SESSION old_mode='ZERO_DATE_TIME_CAST';
+SELECT CAST('100000:00:00' AS DATETIME);
+CAST('100000:00:00' AS DATETIME)
+NULL
+Warnings:
+Warning	1292	Incorrect datetime value: '100000:00:00'
+SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME));
+EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME))
+NULL
+Warnings:
+Warning	1292	Incorrect datetime value: '100000:00:00'
+SELECT CAST('100000:00:00' AS DATE);
+CAST('100000:00:00' AS DATE)
+NULL
+Warnings:
+Warning	1292	Incorrect datetime value: '100000:00:00'
+SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATE));
+EXTRACT(DAY FROM CAST('100000:00:00' AS DATE))
+NULL
+Warnings:
+Warning	1292	Incorrect datetime value: '100000:00:00'
+SET SESSION old_mode=DEFAULT;
+#
 # End of 10.5 tests
 #
diff --git a/mysql-test/main/func_extract.test b/mysql-test/main/func_extract.test
index 6167780b9bf..05c5529659b 100644
--- a/mysql-test/main/func_extract.test
+++ b/mysql-test/main/func_extract.test
@@ -517,6 +517,16 @@ DROP FUNCTION select02;
 
 SELECT EXTRACT(HOUR_MICROSECOND FROM '42949672955000x1');
 
+--echo #
+--echo # MDEV-23687 Assertion `is_valid_value_slow()' failed in Datetime::Datetime upon EXTRACT under mode ZERO_DATE_TIME_CAST
+--echo #
+
+SET SESSION old_mode='ZERO_DATE_TIME_CAST';
+SELECT CAST('100000:00:00' AS DATETIME);
+SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME));
+SELECT CAST('100000:00:00' AS DATE);
+SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATE));
+SET SESSION old_mode=DEFAULT;
 
 --echo #
 --echo # End of 10.5 tests
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 072cb34c0f5..a2d1c63f006 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -2585,7 +2585,8 @@ Sql_mode_dependency Item_time_typecast::value_depends_on_sql_mode() const
 
 bool Item_date_typecast::get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
 {
-  date_mode_t tmp= (fuzzydate | sql_mode_for_dates(thd)) & ~TIME_TIME_ONLY;
+  date_mode_t tmp= (fuzzydate | sql_mode_for_dates(thd))
+                    & ~TIME_TIME_ONLY & ~TIME_INTERVAL_DAY;
   // Force truncation
   Date *d= new(ltime) Date(thd, args[0], Date::Options(date_conv_mode_t(tmp)));
   return (null_value= !d->is_valid_date());
@@ -2594,7 +2595,8 @@ bool Item_date_typecast::get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzy
 
 bool Item_datetime_typecast::get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
 {
-  date_mode_t tmp= (fuzzydate | sql_mode_for_dates(thd)) & ~TIME_TIME_ONLY;
+  date_mode_t tmp= (fuzzydate | sql_mode_for_dates(thd))
+                    & ~TIME_TIME_ONLY & ~TIME_INTERVAL_DAY;
   // Force rounding if the current sql_mode says so
   Datetime::Options opt(date_conv_mode_t(tmp), thd);
   Datetime *dt= new(ltime) Datetime(thd, args[0], opt,