Другие значения относятся к текущей дате, последним 30 дням, следующей неделе и т. Д.
Каков наилучший способ хранить эти данные в таблице SQL?
Если вы храните эти диапазоны в таблице, вы должны обновлять их каждый день. В этом случае вы должны обновлять каждую строку по-разному каждый день. Это может быть большой проблемой; это не может быть.
Обычно в такой таблице не так много строк, часто меньше 50. Структура таблицы очевидна. Обновление должно выполняться заданием cron (или его эквивалентом), и вы должны запускать очень требовательные отчеты об исключениях каждый день, чтобы убедиться, что все обновлено правильно.
Как правило, отчеты такого типа не должны давать результатов, если все в порядке. У вас есть дополнительное усложнение, что вывод такого отчета из cron не будет производить вывод, если cron не запущен. И это не хорошо.
Вы также можете создать представление, которое не требует обслуживания. С несколькими десятками строк он может быть медленнее, чем физическая таблица, но все равно может быть достаточно быстрым. И это исключает все обслуживание и административную работу для этих диапазонов. (Проверьте наличие ошибок, потому что я этого не сделал.)
create view relative_date_ranges as
select 'Last 30 days' as range_name,
(current_date - interval '30' day)::date as range_start,
current_date as range_end
union all
select 'Last week' as range_name,
(current_date - interval '7' day)::date as range_start,
current_date as range_end
union all
select 'Next week' as range_name,
(current_date + interval '7' day)::date as range_start,
current_date as range_end
В зависимости от приложения вы можете обрабатывать «абсолютные» диапазоны одинаково.
...
union all
select 'March this year' as range_name,
(extract(year from current_date) || '-03-01')::date as range_start,
(extract(year from current_date) || '-03-31')::date as range_end