none
Diferenças em Horas e minutos entre duas Datas RRS feed

  • Pergunta

  • Boa tarde , pesquisei pelo forum sobre diferencas entre datas mas encontrei varios casos...mas o que preciso é da diferencas entre duas datas com horas e minutos por exmplo em um textbox tem: 10/10/2012 07:30 (campo datetime no banco) 

    no outro tem             10/10/2012 08:00  (campo datetime no banco) 

    e tenho um campo no meu banco de dados que irá receber a diferenças entre essas duas horas () campo datetime) mas em horas e minutos como por exemplo 00:30 minutos no caso acima

    tem como fazer ??

    Ja tentei usar o SELECT DATEDIFF  no sql e funciona com um resultado somente mas no meu caso isso eh um controle de manutenção de veículos e preciso dizer que veiculo X ficou de tal hora a tal hora lavando depois o mesmo veiculo ficou de tal hora ou dia a tal hora ou dia aguardando material e por ai vai 

    tem como fazer isso alguem pode me dar uma luz ??

    Obrigado pela atencao!

    domingo, 20 de maio de 2012 20:05

Respostas

  • O nosso amigo mostrou a solução usando TimeSpan acima, fica aqui a dica usando SQL:

    --Criando variavel do tipo table para simular tabela do banco de dados
    DECLARE @TABELA_VEICULOS TABLE
    (
    ID INT,
    ManutencaoEntrada DATETIME,
    ManutencaoSaida DATETIME
    )
    
    --Inserindo valores
    INSERT INTO @TABELA_VEICULOS VALUES (1,'2012-03-03 11:20:00','2012-03-03 12:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (2,'2012-03-30 09:15:00','2012-03-30 19:50:00')
    INSERT INTO @TABELA_VEICULOS VALUES (3,'2012-03-05 08:00:00','2012-03-05 11:00:00')
    INSERT INTO @TABELA_VEICULOS VALUES (4,'2012-03-01 22:14:00','2012-03-01 22:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (5,'2012-03-01 15:47:00','2012-03-01 18:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (5,'2012-03-01 15:47:00',null)
    
    --Usando dos segundos para calcular o total de horas entre as manutenções
    SELECT 
    	Agr.ID,	
    	Agr.ManutencaoEntrada,
    	Agr.ManutencaoSaida,
    	CASE WHEN Agr.TotalSegundos IS NOT NULL THEN
    		CONVERT(VARCHAR, ((Agr.TotalSegundos)/3600)) +':' +
    		CONVERT(VARCHAR, (((Agr.TotalSegundos)%3600)/60)) +':' +
    		CONVERT(VARCHAR, (((Agr.TotalSegundos)%3600)%60)) 
    	ELSE
    		'0:0:0'
    	END TotalDeHoras 
    FROM 
    (
    	SELECT 
    		ID,
    		ManutencaoEntrada,
    		ManutencaoSaida,
    		DATEDIFF(SECOND,ManutencaoEntrada,ManutencaoSaida) TotalSegundos
    	FROM
    		@TABELA_VEICULOS
    ) 
    Agr

    Resultado:

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    segunda-feira, 21 de maio de 2012 01:07

Todas as Respostas

  • Você pretende fazer esta conta aonde, na aplicação (usando da classe TimeSpan) ou no banco de dados (Usando de agregação)

    Estou respondendo pelo telefone, quando eu chegar em casa posso postar um exemplo, se possivel responda minha duvida acima =]


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    domingo, 20 de maio de 2012 21:29
  • Veja se isso resolve.

        DateTime horaChegada = DateTime.Parse(textBox1.Text);
                DateTime horaSaida = DateTime.Parse(textBox2.Text);
                TimeSpan tempoPercorrido;
                tempoPercorrido = horaSaida.Subtract(horaChegada);
                textBox3.Text = tempoPercorrido.ToString();

    http://social.msdn.microsoft.com/Forums/pt/vscsharppt/thread/d0b6d482-534b-4d5e-8116-b0f811e35510

    http://csharpmasters.blogspot.com/2007/05/o-c-trouxe-grandes-facilidades-no.html

        
    • Editado Nego jl domingo, 20 de maio de 2012 21:53
    domingo, 20 de maio de 2012 21:48
  • O nosso amigo mostrou a solução usando TimeSpan acima, fica aqui a dica usando SQL:

    --Criando variavel do tipo table para simular tabela do banco de dados
    DECLARE @TABELA_VEICULOS TABLE
    (
    ID INT,
    ManutencaoEntrada DATETIME,
    ManutencaoSaida DATETIME
    )
    
    --Inserindo valores
    INSERT INTO @TABELA_VEICULOS VALUES (1,'2012-03-03 11:20:00','2012-03-03 12:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (2,'2012-03-30 09:15:00','2012-03-30 19:50:00')
    INSERT INTO @TABELA_VEICULOS VALUES (3,'2012-03-05 08:00:00','2012-03-05 11:00:00')
    INSERT INTO @TABELA_VEICULOS VALUES (4,'2012-03-01 22:14:00','2012-03-01 22:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (5,'2012-03-01 15:47:00','2012-03-01 18:20:00')
    INSERT INTO @TABELA_VEICULOS VALUES (5,'2012-03-01 15:47:00',null)
    
    --Usando dos segundos para calcular o total de horas entre as manutenções
    SELECT 
    	Agr.ID,	
    	Agr.ManutencaoEntrada,
    	Agr.ManutencaoSaida,
    	CASE WHEN Agr.TotalSegundos IS NOT NULL THEN
    		CONVERT(VARCHAR, ((Agr.TotalSegundos)/3600)) +':' +
    		CONVERT(VARCHAR, (((Agr.TotalSegundos)%3600)/60)) +':' +
    		CONVERT(VARCHAR, (((Agr.TotalSegundos)%3600)%60)) 
    	ELSE
    		'0:0:0'
    	END TotalDeHoras 
    FROM 
    (
    	SELECT 
    		ID,
    		ManutencaoEntrada,
    		ManutencaoSaida,
    		DATEDIFF(SECOND,ManutencaoEntrada,ManutencaoSaida) TotalSegundos
    	FROM
    		@TABELA_VEICULOS
    ) 
    Agr

    Resultado:

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    segunda-feira, 21 de maio de 2012 01:07
  • Obrigado por responder Vitor,

    mas tenho uma pergunta mais ... seria possivel fazer dessa forma que vc fez no SQL acima mas tendo somente o campo DATA_INICIO sendo que a data final de meu evento atual sera a data inicio do proximo evento .. na minha tabela tem somente o campo do inicio da manutencao mas nao tem o fim, pq quando o usuario vai cadastrar ele ainda nao sabe a data e hora do fim daquele determinado evento  o que eu gostaria de fazer eh que no campo TOTAL_HORAS () esta comentado no codigo abaixo)da procedure ja incluir o valor em horas entre a data do inicio do ultimo evento e a data do inicio do evento que esta sendo incuido

         


    @DT_INICIO DATETIME
    ,@PREVISAO DATETIME
    --,@TOTAL_HORAS INT
    ,@EVENTO INT
    ,@OBSERVACAO VARCHAR (500)
    ,@MANUTENCAO_ID INT

     AS 
     BEGIN

     DECLARE @DATA_VALIDA DATETIME

     SELECT @DATA_VALIDA = (SELECT TOP 1 ACO_DT_INICIO FROM MANUTENCAO_ACOMPANHAMENTO ORDER BY ACO_ID DESC)

     IF (@DATA_VALIDA < @DT_INICIO)

     BEGIN 
     INSERT INTO MANUTENCAO_ACOMPANHAMENTO  (ACO_DT_INICIO,ACO_DT_PREVISAO,EVE_ID,ACO_OBSERVACAO,MAN_ID) 
     VALUES (@DT_INICIO,@PREVISAO ,@EVENTO,@OBSERVACAO,@MANUTENCAO_ID)

     END
     END

    obrigado pela atencao!

    quinta-feira, 24 de maio de 2012 03:01