Pergunta

Tenho datas armazenadas como bigint em minha tabela e estou tentando selecionar registros com mais de 30 dias.Eu vi uma tonelada de perguntas no SO e no Google relacionadas a esta questão, mas não estou encontrando o que preciso.

Aqui está o que eu tenho, o que parece muito ineficiente:

SELECT
  COUNT(*) 
FROM 
  alert
WHERE 
  ('1969-12-31 19:00:00 GMT'::timestamp + (alert.mytstamp::text)::interval) < (localtimestamp - INTERVAL '30 days')

Pelo que entendi, ele está convertendo o campo bigint mytstamp em um carimbo de data / hora para compará-lo ao carimbo de data / hora "30 dias atrás".Ele faz isso para cada registro na tabela :(. Parece mais eficiente converter o registro de data e hora atual - 30 dias em bigint UMA VEZ, depois comparar com todas as minhas datas bigint.

Minhas habilidades de SQL são fracas, então vá com calma :).Obrigado pela ajuda.

Foi útil?

Solução

Mais uma vez, encontrei uma solução logo após postar no SO.É um amuleto de boa sorte, eu acho.De qualquer forma, parece ser isso que estou procurando e é muito mais eficiente:

SELECT
  COUNT(*) 
FROM 
  alert
WHERE 
  alert.timestamp < extract('epoch' from (CURRENT_TIMESTAMP  - INTERVAL '10 days'))::bigint

Estou me perguntando se o postgres faz o cálculo para extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigint uma vez ou para cada comparação de registro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top