J’ai peur d’être devenu accro à ces badges
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
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
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
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.
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
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 » (pour les personnes vivant en dehors de l’Europe, etc.). Merci beaucoup !
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