Insignia para publicaciones creadas entre la 1 AM y las 5 AM

Me temo que me he vuelto adicto a estas insignias :smiling_face_with_three_hearts:
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

3 Me gusta

Es posible filtrar de la siguiente manera:

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

Espero que esto te ayude.

2 Me gusta

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

Y aún así no aparece nada :thinking:

1 me gusta

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.

3 Me gusta

Genial. Es Europa/Bruselas, GMT +01:00.

3 Me gusta

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
3 Me gusta

Por cierto, buen diseño de insignia: ¿es un SVG con estilos CSS o una imagen basada en píxeles?

3 Me gusta

¡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” :smile: (para personas que viven fuera de Europa, etc.). ¡Muchas gracias!

Hecho en Photoshop y Figma, no con estilos CSS. Publicaré la URL en este foro en cuanto termine el diseño y todos los insignias.

3 Me gusta

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
5 Me gusta

¡Muchas gracias! :blush:

1 me gusta