Temo di essermi affezionato a questi badge
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
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
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
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.
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
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â (per le persone che vivono fuori dallâEuropa, ecc.). Grazie mille!
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