Tenho medo de que eu tenha me viciado nesses emblemas
Então, este será concedido aos usuários que criaram posts entre 1h e 5h, atualizado diariamente.
Mas, infelizmente, não faço ideia de como selecionar esse intervalo. Qualquer ajuda é apreciada.
SELECT user_id, current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at > CURRENT_DATE /* Como fazer o BETWEEN '1AM' e '5AM'? */
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
Muito obrigado pela sua ajuda. Tentei o seu exemplo, mas nenhum distintivo foi concedido na pré-visualização. Aqui são 11:17 da manhã e alterei o horário no seu exemplo entre 10:00 e 13:00, criei um tópico de demonstração e uma resposta, mas nada aparece. Tentei também:
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
O banco de dados registra o horário em GMT+0, então você precisa adicionar essa diferença de fuso horário ao seu fuso. Se você me informar seu fuso horário, posso ajustar isso para você.
Você não está recebendo a medalha porque adicionou a restrição HAVING count(*) >= 100, então você só poderá ganhar a medalha se fizer mais de 100 postagens nesse intervalo de tempo.
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
OMG, você tem razão, esqueci disso. Funciona. Se não for pedir demais, é possível fazer essa verificação de horário com base no fuso horário escolhido pelo usuário no perfil dele? Caso contrário, o fórum vai ficar cheio de medalhas “Watchmens” (para pessoas que moram fora da Europa, etc.). Muito obrigado!
Considerando o fuso horário do usuário, a consulta ficará assim:
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