Me temo que me he vuelto adicto a estas insignias
Esta se otorgará a los usuarios que hayan creado publicaciones entre la 1 a. m. y las 5 a. m., y se actualizará diariamente.
Pero, por desgracia, no tengo idea de cómo seleccionar ese intervalo. Cualquier ayuda será apreciada.
SELECT user_id, current_timestamp granted_at
FROM badge_posts p
WHERE p.created_at > CURRENT_DATE /* ¿Cómo poner un rango entre '1 a. m.' y '5 a. m.'? */
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
Muchas gracias por tu ayuda. Probé tu ejemplo, pero no se otorga ninguna insignia en la vista previa. Son las 11:17 a. m. aquí, he cambiado la hora en tu ejemplo entre las 10:00 y las 13:00, creé un tema de demostración y una respuesta, pero no aparece nada. También intenté lo siguiente:
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 datos registra la marca de tiempo en GMT+0, por lo que debes sumar esa diferencia horaria a tu zona horaria. Si me dices tu zona horaria, puedo ajustarla por ti.
No estás recibiendo la insignia porque has añadido la restricción HAVING count(*) >= 100, por lo que solo podrás obtener la insignia si publicas más de 100 mensajes en ese intervalo de tiempo.
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, tienes razón, se me olvidó eso! Funciona. Si no es mucha molestia, ¿sería posible que esa verificación de hora se base en la hora que el usuario haya elegido en su perfil? De lo contrario, el foro estará lleno de insignias de “Watchmen” (para personas que viven fuera de Europa, etc.). ¡Muchas gracias!
Considerando la zona horaria del usuario, la consulta se vería así:
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