[RESOLVIDO] Média de datas (timestamp) em dias

Gostaria de saber como calcular quantos dias se passaram entre um pedido e outro de um mesmo cliente para poder estar fazendo uma média (em dias) e saber qual a frequência de compra do cliente.

tabela

Na tabela acima a data é um Timestamp

1 curtida

talvez ajude: Biblioteca de data java para calculo de dias

Pesquisar ainda tá liberado, né?

Sei q tem funções q fazem isso como por exemplo:
timestampDiff(day, data1,data2) // Me retorna o periodo entre a data1 e data2 em dias

Mas no meu caso eu n tenho a data1 e data2 na mesma linha.

Tenho que fazer um select para escolher um cliente (… Where IDCliente=?) para depois calcular a diferença entre as datas.

Eu consigo fazer isso apenas utilizando SQL ou é melhor minha aplicação fazer os cálculos?

Dá para fazer só com SQL, usando subqueries.
Dá para fazer só com SQL, usando stored procedure.
Dá para fazer na aplicação.

Caso 1: só sql e subqueries: complexidade no banco
Caso 2: stored procedure: complexidade no banco
Caso 3: aplicação, em geral, é mais lenta que o banco de dados.

Estou tentando fazer no banco justamente pelo fato da aplicação ser mais lenta.

Você pode me dar um exemplo com subqueries?

Afirmações sem um código? Poderia passar algum código para ajudar já que afirma!

Basicamente:

SELECT 
    A.idpedido,
    A.DataPedido, 
    CASE WHEN b.DataPedido is null then 0 else
    TIMESTAMPDIFF(DAY,A.DataPedido,B.DataPedido) end AS timedifference 
FROM new_table A 
LEFT JOIN new_table B ON B.idpedido= (
 SELECT MIN(B2.idpedido) FROM new_table B2 WHERE B2.idpedido>A.idpedido
)
ORDER BY A.idpedido ASC

Exemplo OnLine

Isso é um exemplo em dois campos, mas, pode ser feito com mais filtro dessa forma você entenderá o processo …

Não é muito performático, mas, se for para pequenas massas de dados é até satisfatório, o que importa e que até pode haver uma paginação se precisar o contexto dessa SQL é o mais importante

Desculpe, acho q não expliquei direito o que quero.

Exemplo
idpedido / idCliente / data
1 / 2 /2019-01-01
2 / 2 /2019-01-12
3 / 2 /2019-01-28
4 / 2 /2019-02-09

para o idCliente = 2
a diferença entre a data do pedido 1 e 2 (11 dias)
e posteriormente entre o pedido 2 e 3 (16 dias)
e por último 3 e 4 (12 dias)

Na SQL que eu te passei é só colocar um where para idCliente =1 ou até agrupar por cliente!

Se você precisar pegar por cliente na sua SQL coloque where idCliente = 1

Rapaz eu fiz todo o processo para você agora é só adequar, estudar Banco Estruturado e SQL é a base de qualquer programador

SELECT 
    A.idpedido,
    A.IDCLIENTE,
    A.DataPedido, 
CASE WHEN b.DataPedido is null then 0 else
    TIMESTAMPDIFF(DAY,A.DataPedido,B.DataPedido) end AS timedifference 
FROM PEDIDO A 
LEFT JOIN PEDIDO B ON B.idpedido= (
     SELECT MIN(B2.idpedido) FROM PEDIDO B2 WHERE B2.idpedido>A.idpedido AND B2.IDCLIENTE=2
)
WHERE
    A.IDCLIENTE = 2
ORDER BY A.idpedido DESC LIMIT 12

Quando @tsartori aprende o processo que a ajuda é para desenvolver e a pessoa consegue resolver fica mais bonito a pergunta e a resposta.

Aprenda que nós sempre damos um norte, um caminho e a pessoa precisa surfar a onda e não deixar que as pessoas surfe por ela.

1 curtida

De fato, obrigado @Dragoon!