diff --git a/frontend/src/metabase/parameters/utils/date-formatting.ts b/frontend/src/metabase/parameters/utils/date-formatting.ts
index de880bcf6a235431d38f5995afb10f9c6c0cfe6d..ed4db3d41879cb9e39a0f6f399dab4a1846c22d9 100644
--- a/frontend/src/metabase/parameters/utils/date-formatting.ts
+++ b/frontend/src/metabase/parameters/utils/date-formatting.ts
@@ -30,7 +30,10 @@ function getFilterValueSerializer(func: (...args: any[]) => string) {
   };
 }
 
-const serializersByOperatorName: Record<string, (...args: any[]) => string> = {
+const serializersByOperatorName: Record<
+  string,
+  (...args: any[]) => string | null
+> = {
   previous: getFilterValueSerializer((value, unit, options = {}) => {
     if (options.startingFrom) {
       const [fromValue, fromUnit] = options.startingFrom;
@@ -53,8 +56,8 @@ const serializersByOperatorName: Record<string, (...args: any[]) => string> = {
   exclude: (filter: any[]) => {
     const [_op, _field, ...values] = filter;
     const operator = getExcludeOperator(filter);
-    if (!operator) {
-      return "";
+    if (!operator || !values.length) {
+      return null;
     }
     const options = operator
       .getOptions()
diff --git a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..6dd285626db03869482f8503575a882afac0e61f
--- /dev/null
+++ b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/24235-exlude-all-date-options.cy.spec.js
@@ -0,0 +1,74 @@
+import { popover, restore, visitDashboard } from "__support__/e2e/helpers";
+import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
+
+const { PRODUCTS, PRODUCTS_ID } = SAMPLE_DATABASE;
+
+const questionDetails = {
+  query: { "source-table": PRODUCTS_ID },
+};
+
+const parameter = {
+  id: "727b06c1",
+  name: "Date Filter",
+  sectionId: "date",
+  slug: "date_filter",
+  type: "date/all-options",
+};
+
+const parameterTarget = [
+  "dimension",
+  ["field", PRODUCTS.CREATED_AT, { "temporal-unit": "month" }],
+];
+
+describe("issue 24235", () => {
+  beforeEach(() => {
+    restore();
+    cy.signInAsAdmin();
+    cy.intercept("POST", "/api/dashboard/**/query").as("getCardQuery");
+  });
+
+  it("should remove filter when all exclude options are selected (metabase#24235)", () => {
+    cy.createQuestionAndDashboard({ questionDetails }).then(
+      ({ body: { id, card_id, dashboard_id } }) => {
+        cy.addFilterToDashboard({ filter: parameter, dashboard_id });
+        mapParameterToDashboardCard({ id, card_id, dashboard_id });
+        visitDashboard(dashboard_id);
+      },
+    );
+
+    cy.findByText(parameter.name).click();
+
+    popover().within(() => {
+      cy.findByText("Exclude...").click();
+      cy.findByText("Days of the week...").click();
+      cy.findByText("Select none...").click();
+      cy.findByText("Select all...").click();
+      cy.findByText("Update filter").click();
+    });
+
+    cy.wait("@getCardQuery");
+    cy.findByText("Rows 1-13 of 200").should("be.visible");
+  });
+});
+
+const mapParameterToDashboardCard = ({ id, card_id, dashboard_id }) => {
+  cy.request("PUT", `/api/dashboard/${dashboard_id}/cards`, {
+    cards: [
+      {
+        id,
+        card_id,
+        row: 0,
+        col: 0,
+        sizeX: 18,
+        sizeY: 10,
+        parameter_mappings: [
+          {
+            card_id,
+            parameter_id: parameter.id,
+            target: parameterTarget,
+          },
+        ],
+      },
+    ],
+  });
+};