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

12 respostas Resolvido
mysql
T

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

12 Respostas

F

talvez ajude: Biblioteca de data java para calculo de dias

D

Pesquisar ainda tá liberado, né?

T

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

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.

T

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

Você pode me dar um exemplo com subqueries?

D

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

D

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

T

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)

D

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

T
Solucao aceita
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
D

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.

T

De fato, obrigado @Dragoon!

Criado 15 de outubro de 2019
Ultima resposta 16 de out. de 2019
Respostas 12
Participantes 4