Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

177
Views
Comparar HORA CON ZONA HORARIA arroja un resultado inesperado

¿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; -- false
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Creo 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;
over 4 years ago · Santiago Trujillo Report

0

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 time with time zone ( timetz ) en absoluto. El tipo está roto por diseño y oficialmente desaconsejado en Postgres. Ver:

  • Hora de Postgres con igualdad de zona horaria

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:

  • ¿Cómo agregar un indicador de día/noche a una columna de marca de tiempo?

¿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:

  • Realice esta consulta de horas de funcionamiento en PostgreSQL
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!