Distintivo para posts criados entre 1h e 5h

Tenho medo de que eu tenha me viciado nesses emblemas :smiling_face_with_three_hearts:
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

3 curtidas

É possível filtrar da seguinte forma:

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

Espero que ajude.

2 curtidas

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

E ainda assim nada aparece :thinking:

1 curtida

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ê.

3 curtidas

Ótimo. É Europa/Bruxelas, GMT +01:00.

3 curtidas

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
3 curtidas

A propósito, legal o design da badge: é um SVG estilizado com CSS ou uma imagem baseada em pixels?

3 curtidas

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” :smile: (para pessoas que moram fora da Europa, etc.). Muito obrigado!

Feito no Photoshop e Figma, não estilizado com CSS. Em breve, postarei o URL neste fórum, assim que terminar o design e todos os badges.

3 curtidas

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
5 curtidas

Muito obrigada! :blush:

1 curtida