Badge pour les publications créées entre 1h et 5h du matin

J’ai peur d’être devenu accro à ces badges :smiling_face_with_three_hearts:
Celui-ci sera donc accordé aux utilisateurs ayant publié des messages entre 1 h et 5 h, mis à jour quotidiennement.
Mais malheureusement, je ne sais pas comment sélectionner cet intervalle. Toute aide serait appréciée.

SELECT user_id, current_timestamp granted_at 
FROM badge_posts p  
WHERE p.created_at > CURRENT_DATE /* Comment faire pour être entre '1h' et '5h' ? */ 
GROUP BY user_id 
HAVING count(*) >= 100

Il est possible de filtrer comme suit :

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

J’espère que cela vous sera utile.

Merci beaucoup pour votre aide. J’ai essayé votre exemple, mais aucun badge n’est accordé dans l’aperçu. Il est 11 h 17 ici, j’ai modifié l’heure dans votre exemple entre 10 h 00 et 13 h 00, et j’ai créé un sujet de démonstration ainsi qu’une réponse, mais rien ne s’affiche. J’ai également essayé :

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

Et toujours rien ne s’affiche :thinking:

La base de données enregistre l’horodatage en GMT+0, vous devez donc ajouter cette différence d’heure à votre fuseau horaire. Si vous me indiquez votre fuseau horaire, je peux l’ajuster pour vous.

Super. C’est Europe/Bruxelles, GMT +01:00.

Vous ne recevez pas le badge car vous avez ajouté la contrainte HAVING count(*) >= 100, ce qui signifie que vous ne pourrez obtenir le badge que si vous publiez plus de 100 messages durant cet intervalle de temps.

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

Au fait, beau design de badge : s’agit-il d’un SVG stylisé en CSS ou d’une image basée sur des pixels ?

OMG tu as raison, j’ai oublié ça. Ça marche. Si ce n’est pas trop demander, est-il possible que ce contrôle horaire soit basé sur l’heure choisie par l’utilisateur dans son profil ? Sinon, le forum sera rempli de badges « Watchmen » :grinning_face_with_smiling_eyes: (pour les personnes vivant en dehors de l’Europe, etc.). Merci beaucoup !

Créé dans Photoshop et Figma, pas en CSS stylisé. Je publierai l’URL sur ce forum bientôt, une fois que j’aurai terminé le design et tous les badges.

En tenant compte du fuseau horaire de l’utilisateur, la requête ressemblera à ceci :

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

Merci beaucoup ! :blush: