Execute esta consulta de horas de operação no PostgreSQL
Estou na pilha do RoR e precisei escrever um SQL real para concluir esta consulta para todos os registros "abertos", o que significa que o horário atual está dentro do horário especificado de operação. Nohours_of_operations
mesa doisinteger
colunasopens_on
ecloses_on
armazenar um dia da semana e doistime
Camposopens_at
ecloses_at
armazene a respectiva hora do dia.
Eu fiz uma consulta que compara a data e hora atuais com os valores armazenados, mas estou me perguntando se existe uma maneira de transmitir para algum tipo de tipo de data e o PostgreSQL faça o resto?
A carne da consulta é:
WHERE (
(
/* Opens in Future */
(opens_on > 5 OR (opens_on = 5 AND opens_at::time > '2014-03-01 00:27:25.851655'))
AND (
(closes_on < opens_on AND closes_on > 5)
OR ((closes_on = opens_on)
AND (closes_at::time < opens_at::time AND closes_at::time > '2014-03-01 00:27:25.851655'))
OR ((closes_on = 5)
AND (closes_at::time > '2014-03-01 00:27:25.851655' AND closes_at::time < opens_at::time)))
OR
/* Opens in Past */
(opens_on < 5 OR (opens_on = 5 AND opens_at::time < '2014-03-01 00:27:25.851655'))
AND
(closes_on > 5)
OR
((closes_on = 5)
AND (closes_at::time > '2014-03-01 00:27:25.851655'))
OR (closes_on < opens_on)
OR ((closes_on = opens_on)
AND (closes_at::time < opens_at::time))
)
)
A razão para uma complexidade tão densa é que uma hora de operação pode terminar no final da semana, por exemplo, começando ao meio-dia do domingo e passando às 6 da manhã de segunda-feira. Como eu armazeno valores no UTC, há muitos casos em que a hora local do usuário pode ser alterada de uma maneira muito estranha. A consulta acima garante que você pode digitar QUALQUER duas vezes da semana e compensamos o empacotamento.