diff --git a/src/metabase/query_processor/expand.clj b/src/metabase/query_processor/expand.clj
index 7c08ac74c45b439df87b418962363aa787aff1ed..29e1c6d8acd8e803b6e95b6b7a9b573799dc3d4b 100644
--- a/src/metabase/query_processor/expand.clj
+++ b/src/metabase/query_processor/expand.clj
@@ -301,20 +301,19 @@
     (filter {} (time-interval (field-id 100) :current :day)) "
   [f n unit]
   (if-not (integer? n)
-    (let [n (normalize-token n)]
-      (case n
-        :current (recur f  0 unit)
-        :last    (recur f -1 unit)
-        :next    (recur f  1 unit)))
+    (case (normalize-token n)
+      :current (recur f  0 unit)
+      :last    (recur f -1 unit)
+      :next    (recur f  1 unit))
     (let [f (datetime-field f unit)]
       (cond
         (core/= n  0) (= f (value f (relative-datetime :current)))
         (core/= n -1) (= f (value f (relative-datetime -1 unit)))
         (core/= n  1) (= f (value f (relative-datetime  1 unit)))
-        (core/< n -1) (between f (value f (relative-datetime (dec n) unit))
-                                 (value f (relative-datetime      -1 unit)))
-        (core/> n  1) (between f (value f (relative-datetime       1 unit))
-                               (value f (relative-datetime (inc n) unit)))))))
+        (core/< n -1) (between f (value f (relative-datetime  n unit))
+                                 (value f (relative-datetime -1 unit)))
+        (core/> n  1) (between f (value f (relative-datetime  1 unit))
+                                 (value f (relative-datetime  n unit)))))))
 
 (s/defn ^:ql ^:always-validate filter
   "Filter the results returned by the query.
diff --git a/test/metabase/query_processor_test/date_bucketing_test.clj b/test/metabase/query_processor_test/date_bucketing_test.clj
index 30ba217fadc56f1854afff011b024b0f19b5ccc8..eeee25db76c9fc3660e461a2f403d29bcd9cb6a5 100644
--- a/test/metabase/query_processor_test/date_bucketing_test.clj
+++ b/test/metabase/query_processor_test/date_bucketing_test.clj
@@ -337,12 +337,13 @@
 ;; that actually reflects the units the results are in.
 ;; eg when we breakout by one unit and filter by another, make sure the results and the col info
 ;; use the unit used by breakout
-(defn- date-bucketing-unit-when-you [& {:keys [breakout-by filter-by]}]
+(defn- date-bucketing-unit-when-you [& {:keys [breakout-by filter-by with-interval]
+                                        :or   {with-interval :current}}]
   (let [results (data/with-temp-db [_ (checkins:1-per-day)]
                   (data/run-query checkins
                     (ql/aggregation (ql/count))
                     (ql/breakout (ql/datetime-field $timestamp breakout-by))
-                    (ql/filter (ql/time-interval $timestamp :current filter-by))))]
+                    (ql/filter (ql/time-interval $timestamp with-interval filter-by))))]
     {:rows (or (-> results :row_count)
                (throw (ex-info "Query failed!" results)))
      :unit (-> results :data :cols first :unit)}))
@@ -366,3 +367,12 @@
 (expect-with-non-timeseries-dbs-except #{:bigquery}
   {:rows 1, :unit :hour}
   (date-bucketing-unit-when-you :breakout-by "hour", :filter-by "day"))
+
+;; make sure if you use a relative date bucket in the past (e.g. "past 2 months") you get the correct amount of rows (#3910)
+(expect-with-non-timeseries-dbs-except #{:bigquery}
+  {:rows 2, :unit :day}
+  (date-bucketing-unit-when-you :breakout-by "day", :filter-by "day", :with-interval -2))
+
+(expect-with-non-timeseries-dbs-except #{:bigquery}
+  {:rows 2, :unit :day}
+  (date-bucketing-unit-when-you :breakout-by "day", :filter-by "day", :with-interval 2))