diff --git a/superset/utils/date_parser.py b/superset/utils/date_parser.py index 2db8deb1ecb..4fbe79e4728 100644 --- a/superset/utils/date_parser.py +++ b/superset/utils/date_parser.py @@ -477,10 +477,20 @@ def get_since_until( # pylint: disable=too-many-arguments,too-many-locals,too-m ) if time_shift: - time_delta_since = parse_past_timedelta(time_shift, _since) - time_delta_until = parse_past_timedelta(time_shift, _until) - _since = _since if _since is None else (_since - time_delta_since) - _until = _until if _until is None else (_until - time_delta_until) + separator = " : " + if separator in time_shift: + # Date range format: parse as a new time range + parts = time_shift.split(separator, 1) + if len(parts) != 2: + raise ValueError(f"Invalid time_shift format: {time_shift}") + since_part, until_part = (part.strip() for part in parts) + _since = parse_human_datetime(since_part) + _until = parse_human_datetime(until_part) + else: + time_delta_since = parse_past_timedelta(time_shift, _since) + time_delta_until = parse_past_timedelta(time_shift, _until) + _since = _since if _since is None else (_since - time_delta_since) + _until = _until if _until is None else (_until - time_delta_until) if instant_time_comparison_range: # This is only set using the new time comparison controls diff --git a/tests/unit_tests/utils/date_parser_tests.py b/tests/unit_tests/utils/date_parser_tests.py index c44b36fc91b..c5e6d512d3a 100644 --- a/tests/unit_tests/utils/date_parser_tests.py +++ b/tests/unit_tests/utils/date_parser_tests.py @@ -271,6 +271,15 @@ def test_get_since_until() -> None: expected = datetime(1999, 12, 25), datetime(2017, 12, 25) assert result == expected + # Test time_shift with date range format (contains ' : ') + result = get_since_until( + time_range="today : tomorrow", + time_shift="yesterday : today", + ) + # When time_shift contains ' : ', it should be parsed as a new time range + expected = datetime(2016, 11, 6), datetime(2016, 11, 7) + assert result == expected + with pytest.raises(ValueError): # noqa: PT011 get_since_until(time_range="tomorrow : yesterday")