Jump to content
jafm

[Resolvido] count Datediff

Recommended Posts

jafm

Boas,

tou aqui a ter uma dificuldade em obter o count da idade, ou seja, eu calculo a idade de cada pessoa, mas agora querias contar quantos tem 10anos, 12anos, por ai fora... so que nao estou a conseguir. A query que estou a usar é:

SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
FROM Cliente INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
where DATEDIFF(YEAR,Data,GETDATE()) >'1'
group by Nome order by Anos asc

Edited by jafm

Share this post


Link to post
Share on other sites
KiNgPiTo

Experimenta:

SELECT Nome, TIMESTAMPDIFF(YEAR,Data,CURDATE()) as Anos
FROM Cliente INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
where DATEDIFF(YEAR,Data,GETDATE()) >'1'
group by Nome order by Anos asc

PS: Não acho boa ideia teres uma coluna chamada Data, visto ser uma palavra reservada...

Edited by KiNgPiTo

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Podes usar uma função para te retornar a idade, desta forma poderá ser utilizada em mais do que uma query, assim:

CREATE FUNCTION [dbo].[idade]
(
@Data DATETIME
)
RETURNS INT
BEGIN
DECLARE @Idade INT;

SET @Idade = DATEDIFF(yy, @Data, GETDATE())
- CASE WHEN datepart  (mm, @Data) <= DATEPART(mm, GETDATE()) and DATEPART(dd, @Data) <= DATEPART(dd, GETDATE())
  THEN 0
  ELSE 1
  END;

RETURN @Idade;
END

Exemplos de utilização:

PRINT [dbo].[idade]('19760625');
PRINT [dbo].[idade]('19760626');
PRINT [dbo].[idade]('19760627');

Depois é só utilizares na tua query, desta forma:

SELECT Nome, [dbo].[idade](Data) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
HAVING Anos > 1
GROUP BY Nome
ORDER BY Anos ASC;

Espero ter ajudado,

Edited by Rechousa

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
pikax

podes fazer assim:

SELECT COUNT(DATEDIFF(MONTH,DataNascimento,GetDate())),DATEDIFF(MONTH,DataNascimento,GetDate()) 
FROM Users
GROUP BY DATEDIFF(MONTH,DataInicio,GetDate())
HAVING DATEDIFF(MONTH,DataNascimento,GetDate())>1


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
jafm

Rechousa, Tive a experimentar a tua ajuda,

SELECT Nome, [dbo].[idade](DATA) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON Cliente.id = ClienteMovimentos.Id
HAVING Anos > 1
GROUP BY Nome
ORDER BY Anos ASC;

dá erro Incorrect syntax near the keyword 'group'

trouquei a ordem do having pelo group by

trocando diz me que Invalid column name 'Anos'

Share this post


Link to post
Share on other sites
Rechousa

Desculpa,

Escrevi o código sem testar :)

Este deverá funcionar:

SELECT Nome, MAX([dbo].[idade](DATA)) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON Cliente.id = ClienteMovimentos.Id
WHERE [dbo].[idade](DATA) > 1
GROUP BY Nome
ORDER BY Anos ASC;

Espero ter ajudado,


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
jafm

Rechousa, dessa maneira fica como eu tinha inicialmente na minha query, não me conta quantos clientes tem 12anos,

assim só me dá a idade de cada cliente

Share this post


Link to post
Share on other sites
Rechousa

Ooops :)

Então, para tal não deverás precisar de aceder à tabela ClienteMovimentos, ou precisas? Não chega verificar a idade do cliente, agrupá-las e fazer o SUM ?

Assim:

SELECT [dbo].[idade](DATA) AS Idade, COUNT(1) AS Contador
   FROM Cliente
   WHERE [dbo].[idade](DATA) > 1
   GROUP BY [dbo].[idade](DATA)
   ORDER BY Idade ASC;


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
jafm

Sim neste caso vou retirar a tabela cliente, pois o objectivo é saber à quanto tempo aquele cliente não faz movimentos

Só que o resultado não é o esperado

aparece algo como

Idade Contador

2 1

2 1

2 2

2 1

2 1

e por ai fora

Share this post


Link to post
Share on other sites
xBoShY

usando a tua query:

SELECT Anos, count(*) AS qt
FROM (SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
FROM Cliente
INNER JOIN ClienteMovimentos
ON CartãoCliente.id = CartãoClienteMovimentos.Id
WHERE DATEDIFF(YEAR,Data,GETDATE()) > 1
group by Nome) AS clientes
GROUP BY Anos
ORDER BY Anos ASC

simplificando a leitura com CTE:

WITH clientes AS (SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
	 FROM Cliente
	 INNER JOIN ClienteMovimentos
	 ON CartãoCliente.id = CartãoClienteMovimentos.Id
	 WHERE DATEDIFF(YEAR,Data,GETDATE()) > 1
	 group by Nome)
SELECT Anos, count(*) AS qt
FROM clientes
GROUP BY Anos
ORDER BY Anos ASC

Edited by xBoShY

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.