Badge per post creati tra le 1:00 e le 5:00

Temo di essermi affezionato a questi badge :smiling_face_with_three_hearts:
Quindi questo verrĂ  assegnato agli utenti che hanno creato post tra le 1:00 e le 5:00, aggiornato quotidianamente.
Ma purtroppo non ho idea di come selezionare quell’intervallo. Qualsiasi aiuto è apprezzato.

SELECT user_id, current_timestamp granted_at 
FROM badge_posts p  
WHERE p.created_at > CURRENT_DATE /* Come fare un BETWEEN '1:00' e '5:00' ? */ 
GROUP BY user_id 
HAVING count(*) >= 100

È possibile filtrare come segue:

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

Spero che questo sia d’aiuto.

Grazie mille per il tuo aiuto. Ho provato il tuo esempio, ma non viene assegnato alcun badge nell’anteprima. Sono le 11:17 qui e ho modificato l’orario nel tuo esempio tra le 10:00 e le 13:00, creando un argomento e una risposta di prova, ma non appare nulla. Ho anche provato:

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

Eppure non appare nulla :thinking:

Il database registra l’orario in GMT+0, quindi devi aggiungere la differenza di fuso orario al tuo fuso. Se mi dici il tuo fuso orario, posso adattarlo per te.

Perfetto. È Europe/Brussels, GMT +01:00.

Non stai ricevendo il badge perché hai aggiunto il vincolo HAVING count(*) >= 100, quindi potrai ottenere il badge solo se effettui più di 100 post in quell’intervallo di 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

A proposito, bel design del badge: è un SVG stilizzato con CSS o un’immagine basata su pixel?

Mamma mia, hai ragione, me ne ero dimenticato. Funziona. Se non chiedo troppo, è possibile basare quel controllo orario sull’ora scelta dall’utente nel suo profilo? Altrimenti, il forum sarà pieno di distintivi “Watchmen” :grinning_face_with_smiling_eyes: (per le persone che vivono fuori dall’Europa, ecc.). Grazie mille!

Realizzato in Photoshop e Figma, non con CSS. Presto pubblicherò l’URL su questo forum, non appena avrò completato il design e tutti i badge.

Considerando il fuso orario dell’utente, la query apparirà così:

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

Grazie mille! :blush: