Боюсь, я пристрастился к этим значкам
Этот значок будет присваиваться пользователям, создавшим посты с 01:00 до 05:00, с ежедневным обновлением.
Но, к сожалению, я не знаю, как выбрать этот временной интервал. Любая помощь будет оценена.
SELECT user_id, current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at > CURRENT_DATE /* Как выбрать интервал между '01:00' и '05:00'? */
GROUP BY user_id
HAVING count(*) >= 100
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at::time BETWEEN '01:00' AND '05:00'
GROUP BY user_id
HAVING count(*) >= 100
Огромное спасибо за помощь. Я попробовал ваш пример, но в превью бейдж не присваивается. Сейчас у меня 11:17, я изменил время в вашем примере на интервал между 10:00 и 13:00, создал демонстрационную тему и ответ, но ничего не появилось. Я также попробовал:
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at:: time >= '10:00:00' or p.created_at:: time < '13:00:00'
GROUP BY user_id
HAVING count(*) >= 100
База данных фиксирует временную метку по GMT+0, поэтому вам нужно прибавить эту разницу к вашему часовому поясу. Если вы скажете мне ваш часовой пояс, я смогу скорректировать это для вас.
Вы не получаете значок, потому что добавили ограничение HAVING count(*) >= 100, поэтому вы сможете получить значок только в том случае, если сделаете более 100 публикаций в течение этого интервала времени.
SELECT
user_id,
current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at::time BETWEEN '02:00' AND '06:00'
GROUP BY user_id
HAVING count(*) >= 100
Ого, ты прав, я об этом забыл. Всё работает. Если я не слишком прошу, можно ли сделать проверку времени на основе выбранного пользователем времени в его профиле? Иначе форум заполнится значками «Наблюдатель» (для людей, живущих вне Европы и т.д.). Большое спасибо!
С учётом часового пояса пользователя запрос будет выглядеть так:
WITH users_timezone AS (
SELECT
user_id,
CASE WHEN utc_offset IS NULL THEN '00:00:00'
ELSE utc_offset END
FROM user_options uo
LEFT JOIN pg_timezone_names pt ON uo.timezone = pt.name
)
SELECT
p.user_id,
current_timestamp granted_at
FROM badge_posts p
INNER JOIN users_timezone ut ON ut.user_id = p.user_id
WHERE (p.created_at+ut.utc_offset)::time BETWEEN '01:00' AND '05:00'
GROUP BY p.user_id
HAVING count(*) >= 100