diff --git a/frontend/src/metabase/lib/expressions/config.js b/frontend/src/metabase/lib/expressions/config.js
index 66f40ae822175ba966a2025c1addfb5c8033e241..590e509d1d2c8d7e46e274e36bec10031327af9e 100644
--- a/frontend/src/metabase/lib/expressions/config.js
+++ b/frontend/src/metabase/lib/expressions/config.js
@@ -363,12 +363,12 @@ export const MBQL_CLAUSES = {
   },
   "date-add": {
     displayName: `dateAdd`,
-    type: "number",
+    type: "expression",
     args: ["expression", "number", "string"],
   },
   "date-subtract": {
     displayName: `dateSubtract`,
-    type: "number",
+    type: "expression",
     args: ["expression", "number", "string"],
   },
 };
diff --git a/frontend/src/metabase/lib/expressions/typeinferencer.js b/frontend/src/metabase/lib/expressions/typeinferencer.js
index 85b359e7bcb6ea67890676c9ad092ca7102e2923..3dc1d5c1fdc06266b06fde78e0bd9305cd472927 100644
--- a/frontend/src/metabase/lib/expressions/typeinferencer.js
+++ b/frontend/src/metabase/lib/expressions/typeinferencer.js
@@ -12,6 +12,7 @@ export function infer(mbql, env) {
   if (!Array.isArray(mbql)) {
     return typeof mbql;
   }
+
   const op = mbql[0];
   switch (op) {
     case OP.Plus:
@@ -32,16 +33,13 @@ export function infer(mbql, env) {
       return MONOTYPE.Boolean;
   }
 
-  if (op === "case") {
-    const clauses = mbql[1];
-    const first = clauses[0];
-    // TODO: type-checker must ensure the consistent types of all clauses.
-    return infer(first[1], env);
-  }
-
-  if (op === "coalesce") {
-    // TODO: type-checker must ensure the consistent types of all arguments
-    return infer(mbql[1], env);
+  switch (op) {
+    case "case":
+      return infer(mbql[1][0][1], env);
+    case "coalesce":
+    case "date-add":
+    case "date-subtract":
+      return infer(mbql[1], env);
   }
 
   const func = MBQL_CLAUSES[op];