now()::date + interval '1 minute'
- полночь. select
s.url,
p.ip,
count(*) as times
from request_log as r
inner join sites as s
on r.site_id = s.id
inner join proxies as p
on r.proxy_id = p.id
where r.when between between now() - interval '24 hours' and now()
group by r.site_id, r.proxy_id
having times < s.max_request
order by times;
when
равному сегодняшнему дню, группировкой по site
и proxy
и агрегацией count
, получаете количество сделанных за сегодня запросов с каждого прокси к каждому сайту. Даже если адреса сайтов и прокси будут храниться в отдельных таблицах, можно использовать объединение. И можно сразу отфильтровать из выборки те сочетания, в которых количество запросов превышает необходимый уровень. Совершенно нельзя предсказать, какую защиту от "злоумышленников" придумали и интегрировали.
now()
возвращает данные типаtimestamp
, содержащие текущие дату и время - 13.06.2019 13:55:00. Если привести эти данные к типуdate
, время будет отброшено - 13.06.2019. Теперь если преобразовать данные обратно кtimestamp
, то получится текущая дата с нулевым временем - 13.06.2019 00:00:00. Прибавление к дате интервала это и делает. Кстати, вместоnow()::date
должно сработать простоCURRENT_DATE
, но это уже вкусовщина.