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

3 « J'aime »

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.

2 « J'aime »

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:

1 « J'aime »

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.

3 « J'aime »

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

3 « J'aime »

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
3 « J'aime »

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

3 « J'aime »

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.

3 « J'aime »

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
5 « J'aime »

Merci beaucoup ! :blush:

1 « J'aime »