У меня есть довольно длинный и сложный SQL-запрос, который выполняется для PostgreSQL 8.3. Часть запроса включает фильтрацию диапазона дат, заканчивающихся сегодняшним днем, например:
where ...
and sp1.price_date between current_date::date - '1 year'::interval and current_date::date
and sp4.price_date between current_date::date - '2 weeks'::interval and current_date::date
and sp5.price_date = (select sp6.price_date
from stock_prices sp6
where sp6.stock_id = s.stock_id
and sp6.price_date < current_date::date
order by sp6.price_date desc
limit 1)
...
Этот запрос выполняется почти 5 минут (в первый раз) и около 1,5 минут во второй раз. Судя по выходным данным EXPLAIN ANALYZE, проблема заключается в current_date. Поэтому я попытался заменить его жестко заданной датой, например:
where ...
and sp1.price_date between '2009-09-30'::date - '1 year'::interval and '2009-09-30'::date
and sp4.price_date between '2009-09-30'::date - '2 weeks'::interval and '2009-09-30'::date
and sp5.price_date = (select sp6.price_date
from stock_prices sp6
where sp6.stock_id = s.stock_id
and sp6.price_date < '2009-09-30'::date
order by sp6.price_date desc
limit 1)
...
Затем запрос выполнялся за полсекунды! Это здорово, за исключением того, что дата встречается в запросе всего в 10 местах, и, конечно же, я не хочу, чтобы пользователю приходилось вручную менять ее в 10 местах. В MS SQL Server я бы просто объявил переменную со значением текущей даты и использовал ее, но очевидно это невозможно в простом SQL в Postgres.
Что я могу сделать, чтобы этот запрос выполнялся быстро, автоматически используя текущую дату?