¿Por qué esta consulta devuelve false ? ¿Es por el formato 22:51:13.202248 +01:00 ?
SELECT now()::time at TIME ZONE 'Europe/London'; -- 22:51:13.202248 +01:00 SELECT now()::time at time zone 'Europe/London' > '22:00:00'::time AND now()::time < '23:35:00'::time as is_currently_open; -- falseCreo que solo necesita adaptar la zona horaria en el segundo predicado para obtener el resultado que desea:
SELECT now()::time at time zone 'Europe/London' > '22:00:00'::time AND now()::time at time zone 'Europe/London' < '23:35:00'::time ----------------^----------------> here AS is_currently_open;now()::time at time zone 'Europe/London' ... devuelve un valor de time with time zone ( timetz ):
Luego lo comparas con el time [without time zone] . No hagas esto. El valor de time se coacciona a timetz en el proceso y se agrega un desplazamiento de tiempo de acuerdo con la configuración de timezone actual. Es decir, su expresión se evaluará de manera diferente con diferentes configuraciones. Además, las reglas de horario de verano no se aplican correctamente. ¡No quieres nada de esto! Ver:
db<>violín aquí
De manera más general, no use el en absoluto. El tipo está roto por diseño y oficialmente desaconsejado en Postgres. Ver:time with time zone ( timetz )
Utilice en su lugar:
SELECT (now() AT TIME ZONE 'Europe/London')::time > '22:00:00' AND (now() AT TIME ZONE 'Europe/London')::time < '23:35:00' AS is_currently_open; El operando correcto puede ser un literal sin tipo ahora, será forzado a time como debería.
BETWEEN es a menudo la herramienta incorrecta para tiempos y marcas de tiempo. Ver:
¿Pero parecería que >= y <= son más apropiados para el horario de apertura ? Entonces BETWEEN se ajusta al caso de uso y lo hace un poco más simple:
SELECT (now() AT TIME ZONE 'Europe/London')::time BETWEEN '22:00:00' AND '23:35:00' AS is_currently_open;Relacionada: