Eu tenho um banco de dados postgresql com vários registros que têm uma coluna de data que se parece com 2020-10-12 12:45:55
. Estou querendo construir uma consulta que procure atividade com carimbos de data/hora em qualquer dia, mas entre 22:00:00 de um dia e 05:00:00 do dia seguinte na parte da hora real.
Como ignoro a data e me concentro apenas na parte da hora desta coluna? Acho que preciso dividir a coluna de data, mas ainda ser capaz de usar <
e >
operadores na string de tempo que resta.
Isso não é uma coluna de data , mas um carimbo de data e hora (data e hora). Assumindo tipo
timestamp
, nãotimetamptz
? (Você deve sempre divulgar as definições de tabela reais.)Ver:
Ou:
O primeiro inclui limites e você pode ajustar conforme necessário.
O segundo usa
BETWEEN
, que sempre inclui limites - portanto, os exclui na expressão negada.Você ainda pode usar um hack para incluir limites construídos com base no conhecimento interno de que o Postgres armazena horários e carimbos de data e hora com resolução de microssegundos (6 dígitos decimais fracionários) em sua implementação atual.
Mas eu aconselho fortemente contra o último. Construir em detalhes de implementação é frágil e feio.
A conversão dos literais de string à direita é opcional, pois seu tipo é derivado da coluna digitada.
Se estamos, de fato, lidando com
timestamptz
você, você precisa definir onde no mundo deve ser 22:00 etc. (Você pode precisar pensar sobre isso comtimestamp
, também.) Veja:Sobre
BETWEEN
e incluindo os limites inferior e superior:Se você executa muito esse tipo de consulta, considere um índice de expressão :
Você pode usar um elenco para
time
. Talvez isso faça:Isso deve corresponder a tudo que começa depois das 22h e termina antes das 5h do dia seguinte.