diff --git a/test/metabase/query_processor_test/date_time_zone_functions_test.clj b/test/metabase/query_processor_test/date_time_zone_functions_test.clj index 880700c11319c6e842a17138f0d0813cf2e405dd..09444fbd5d4fcd6c91df15e9e3af25759f809190 100644 --- a/test/metabase/query_processor_test/date_time_zone_functions_test.clj +++ b/test/metabase/query_processor_test/date_time_zone_functions_test.clj @@ -708,15 +708,58 @@ (mt/formatted-rows [int int int]) first))))))) +(mt/defdataset diff-time-zone-cases + [["times" + [{:field-name "a_dt", :base-type :type/DateTime} + {:field-name "a_dt_ltz", :base-type :type/DateTimeWithLocalTZ} + {:field-name "a_dt_tz", :base-type :type/DateTimeWithTZ} + {:field-name "a_dt_tz_offset", :base-type :type/DateTimeWithZoneOffset} + {:field-name "a_dt_tz_id", :base-type :type/DateTimeWithZoneID} + {:field-name "a_dt_tz_text", :base-type :type/Text} + {:field-name "a_dt_tz_id_text", :base-type :type/Text} + {:field-name "b_dt", :base-type :type/DateTime} + {:field-name "b_dt_ltz", :base-type :type/DateTimeWithLocalTZ} + {:field-name "b_dt_tz", :base-type :type/DateTimeWithTZ} + {:field-name "b_dt_tz_offset", :base-type :type/DateTimeWithZoneOffset} + {:field-name "b_dt_tz_id", :base-type :type/DateTimeWithZoneID} + {:field-name "b_dt_tz_text", :base-type :type/Text} + {:field-name "b_dt_tz_id_text", :base-type :type/Text}] + (let [times ["2022-10-02T01:00:00+01:00[Africa/Lagos]" + "2022-10-02T00:00:00Z[UTC]" + "2022-10-02T01:00:00+01:00[Africa/Lagos]" + "2022-10-03T00:00:00Z[UTC]" + "2022-10-03T00:00:00+01:00[Africa/Lagos]" + "2022-10-09T00:00:00Z[UTC]" + "2022-10-09T00:00:00+01:00[Africa/Lagos]" + "2022-11-02T00:00:00Z[UTC]" + "2022-11-02T00:00:00+01:00[Africa/Lagos]" + "2023-10-02T00:00:00Z[UTC]" + "2023-10-02T00:00:00+01:00[Africa/Lagos]"]] + (for [a times b times] + [(t/local-date-time (u.date/parse a)) ; a_dt + (t/offset-date-time (u.date/parse a)) ; a_dt_ltz + (u.date/parse a) ; a_dt_tz + (t/offset-date-time (u.date/parse a)) ; a_dt_tz_offset + (u.date/parse a) ; a_dt_tz_id + (t/format :iso-offset-date-time (u.date/parse a)) ; a_dt_tz_text + a ; a_dt_tz_id_text + (t/local-date-time (u.date/parse b)) ; b_dt + (t/offset-date-time (u.date/parse b)) ; b_dt_ltz + (u.date/parse b) ; b_dt_tz + (t/offset-date-time (u.date/parse b)) ; b_dt_tz_offset + (u.date/parse b) ; b_dt_tz_id + (t/format :iso-offset-date-time (u.date/parse b)) ; b_dt_tz_text + b]))]]) ; b_dt_tz_id_text + (deftest datetime-diff-time-zones-test (mt/test-drivers (mt/normal-drivers-with-feature :datetime-diff) - (mt/dataset sample-dataset + (mt/dataset diff-time-zone-cases (let [diffs (fn [x y] (let [units [:second :minute :hour :day :week :month :year]] - (->> (mt/run-mbql-query orders - {:limit 1 + (->> (mt/run-mbql-query times + {:filter [:and [:= x $a_dt_tz_text] [:= y $b_dt_tz_text]] :expressions (into {} (for [unit units] - [(name unit) [:datetime-diff x y unit]])) + [(name unit) [:datetime-diff $a_dt_tz $b_dt_tz unit]])) :fields (into [] (for [unit units] [:expression (name unit)]))}) (mt/formatted-rows (repeat (count units) int)) @@ -726,74 +769,74 @@ (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] ; UTC-1 all year (is (partial= {:second 86400 :minute 1440 :hour 24 :day 1} (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-01T23:00:00-01:00 <- datetime in report-timezone offset - "2022-10-03T00:00:00+00:00")))) ; 2022-10-02T23:00:00-01:00 + "2022-10-03T00:00:00Z")))) ; 2022-10-02T23:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:second 86400 :minute 1440 :hour 24 :day 1} - (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00+00:00 - "2022-10-03T00:00:00+00:00"))))) ; 2022-10-03T00:00:00+00:00 + (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00Z + "2022-10-03T00:00:00Z"))))) ; 2022-10-03T00:00:00Z (testing "hour under a day" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:second 82800 :minute 1380 :hour 23 :day 1} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-01T23:00:00-01:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-01T23:00:00-01:00 "2022-10-03T00:00:00+01:00")))) ; 2022-10-02T22:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:second 82800 :minute 1380 :hour 23 :day 0} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-02T00:00:00+00:00 - "2022-10-03T00:00:00+01:00"))))) ; 2022-10-02T23:00:00+00:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-02T00:00:00Z + "2022-10-03T00:00:00+01:00"))))) ; 2022-10-02T23:00:00Z (testing "hour under a week" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:hour 167 :day 7 :week 1} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-01T23:00:00-01:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-01T23:00:00-01:00 "2022-10-09T00:00:00+01:00")))) ; 2022-10-08T22:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:hour 167 :day 6 :week 0} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-02T00:00:00+00:00 - "2022-10-09T00:00:00+01:00"))))) ; 2022-10-08T23:00:00+00:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-02T00:00:00Z + "2022-10-09T00:00:00+01:00"))))) ; 2022-10-08T23:00:00Z (testing "week" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:hour 168 :day 7 :week 1} (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-01T23:00:00-01:00 - "2022-10-09T00:00:00+00:00")))) ; 2022-10-08T23:00:00-01:00 + "2022-10-09T00:00:00Z")))) ; 2022-10-08T23:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:hour 168 :day 7 :week 1} - (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00+00:00 - "2022-10-09T00:00:00+00:00"))))) ; 2022-10-09T00:00:00+00:00 + (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00Z + "2022-10-09T00:00:00Z"))))) ; 2022-10-09T00:00:00Z (testing "hour under a month" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:hour 743 :day 31 :week 4 :month 1} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-01T23:00:00-01:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-01T23:00:00-01:00 "2022-11-02T00:00:00+01:00")))) ; 2022-11-01T22:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:hour 743 :day 30 :week 4 :month 0} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-02T00:00:00+00:00 - "2022-11-02T00:00:00+01:00"))))) ; 2022-11-01T23:00:00+00:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-02T00:00:00Z + "2022-11-02T00:00:00+01:00"))))) ; 2022-11-01T23:00:00Z (testing "month" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:hour 744 :day 31 :month 1 :year 0} (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-01T23:00:00-01:00 - "2022-11-02T00:00:00+00:00")))) ; 2022-11-01T23:00:00-01:00 + "2022-11-02T00:00:00Z")))) ; 2022-11-01T23:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:hour 744 :day 31 :month 1 :year 0} - (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00+00:00 - "2022-11-02T00:00:00+00:00"))))) ; 2022-11-02T00:00:00+00:00 + (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00Z + "2022-11-02T00:00:00Z"))))) ; 2022-11-02T00:00:00Z (testing "year" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:day 365, :week 52, :month 12, :year 1} (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-01T23:00:00-01:00 - "2023-10-02T00:00:00+00:00")))) ; 2023-10-01T23:00:00-01:00 + "2023-10-02T00:00:00Z")))) ; 2023-10-01T23:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] - (is (partial= {:day 365, :week 52, :month 12, :year 1} - (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00+00:00 - "2023-10-02T00:00:00+00:00"))))) ; 2023-10-02T00:00:00+00:00 + (is (partial= {:day 365, :week 52, :month 12, :year 1} + (diffs "2022-10-02T01:00:00+01:00" ; 2022-10-02T00:00:00Z + "2023-10-02T00:00:00Z"))))) ; 2023-10-02T00:00:00Z (testing "hour under a year" (mt/with-temporary-setting-values [driver/report-timezone "Atlantic/Cape_Verde"] (is (partial= {:day 365 :month 12 :year 1} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-01T23:00:00-01:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-01T23:00:00-01:00 "2023-10-02T00:00:00+01:00")))) ; 2023-10-01T22:00:00-01:00 (mt/with-temporary-setting-values [driver/report-timezone "UTC"] (is (partial= {:day 364 :month 11 :year 0} - (diffs "2022-10-02T00:00:00+00:00" ; 2022-10-02T00:00:00+00:00 - "2023-10-02T00:00:00+01:00"))))))))) ; 2023-10-01T23:00:00+00:00 + (diffs "2022-10-02T00:00:00Z" ; 2022-10-02T00:00:00Z + "2023-10-02T00:00:00+01:00"))))))))) ; 2023-10-01T23:00:00Z (deftest datetime-diff-expressions-test (mt/test-drivers (mt/normal-drivers-with-feature :datetime-diff)