none
Cálculo de minutos na mesma coluna - Help! RRS feed

  • Pergunta

  • Olá pessoal, boa tarde.

    Preciso de uma ajuda!

    Tenho que construir uma querie que me traga a diferença entre dois horários, na mesma coluna.

    Por exemplo:

    data_ entrada | hora_entrada |    Tempo    |   Técnico | 

    26/05/2021        16:25:00                             Paulo

    26/05/2020        16:30:00         00:05:00       Paulo

    Eu preciso calcular essa diferença de uma linha para outra em toda a coluna.

    É possível pessoal? Abraço.


    Perez

    quarta-feira, 24 de junho de 2020 18:42

Todas as Respostas

  • se for pelo seu exemplo experimente select data_entrada,hora_entrada,datediff(mm,lag(hora_entrada)over(partition by data_entrada order by hora_entrada),hora_entrada) Tempo,[Técnico] from tabela

    quarta-feira, 24 de junho de 2020 18:58
  • Cristiano,

    Somente a diferença em minutos deverá ser analisada, mesmo existente uma diferença entre datas de forma considerável.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 24 de junho de 2020 22:18
  • Oi Junior, bom dia.

    Sim. na verdade, um técnico pode dar inúmeras entradas no mesmo dia. Portanto, tenho que ver essa diferença de cada entrada que ele deu. Se for maior que 20 minutos, ok! Menor que 20 minutos, tenho que estudar, entendeu?

    Obrigado.


    Perez

    quinta-feira, 25 de junho de 2020 11:41
  • Sempre baseando no horário da entrada anterior.

    Perez

    quinta-feira, 25 de junho de 2020 11:41
  • Vou testar e te falo!

    Obrigado.


    Perez

    quinta-feira, 25 de junho de 2020 11:42
  • Cristiano,

    Ok, obrigado pelo retorno, veja se estes outros exemplos que combinam o usa das funções Lag(), Lead(), DateDiff ou até mesmo o operador Cross Apply, podem te ajudar:

    -- Identificando e Calculando a diferença entre datas --
    Create Table Vendedores
    (Codigo INT , 
     CodigoSell INT,
     TimeSeller DATE, 
     SellerOrigim INT,
     SellerAtual INT,
     SellerName VARCHAR(10))
    Go
    
    Insert Into Vendedores 
    Values (1,10,'2020-02-06',50,1000,'PAUL'),
                 (5,10,'2020-02-17',1500,2000,'JONH'),
                 (8,10,'2020-02-18',2000,50,'PIERRE'),
                 (11,10,'2020-02-19',50,1000,'PAUL'),
                 (18,10,'2020-02-20',1500,2000,'JONH')
    Go
    
    Select * From Vendedores
    Go
    
    -- Identificar a diferença respeitando esta regra - Paul e Jonh,Jonh e Pierre,Pierre e Paul, Paul e John , e depois agrupar.
    
    -- SQL Server 2008 R2 ou inferior --
    Select (V.SellerName + ' --> ' + IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TimeSeller, V2.TimeSeller),0) As 'Tempo em Dias' 
    From Vendedores V Outer Apply (Select Top 1 SellerName, TimeSeller 
                                                             From Vendedores V1 
    														 Where V.Codigo < V1.Codigo 
    														 Order By Codigo) As V2
    Go
    
    -- Versão 2012 ou Superior --
    Select Concat(V.SellerName, ' --> ',IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TimeSeller, V2.TimeSeller),0) As 'Tempo em Dias' 
    From Vendedores V Outer Apply (Select Top 1 SellerName, TimeSeller 
                                                             From Vendedores V1 
    														 Where V.Codigo < V1.Codigo 
    														 Order By Codigo) As V2
    Go
    
    -- Aplicando o Group By através do uso de CTE --
    -- SQL Server 2008 R2 ou inferior --
    
    ;With CTEDiferencaEntreFornecedores2008 (Sellername, Tempo)
    As
    (
    Select (V.SellerName + ' --> ' + IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TimeSeller, V2.TimeSeller),0) As 'Tempo' 
    From Vendedores V Outer Apply (Select Top 1 SellerName, TimeSeller 
                                                             From Vendedores V1 
    														 Where V.Codigo < V1.Codigo 
    														 Order By Codigo) As V2
    )
    Select SellerName, Sum(Tempo) As SomaDoTempo 
    From CTEDiferencaEntreFornecedores2008
    Group By Sellername
    Order By Sellername
    Go
    
    -- Versão 2012 ou Superior --
    ;With CTEDiferencaFornecedores2012 (SellerName, Tempo)
    As
    (Select Concat(V.SellerName, ' --> ',IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TimeSeller, V2.TimeSeller),0) As 'Tempo em Dias' 
    From Vendedores V Outer Apply (Select Top 1 SellerName, TimeSeller 
                                                             From Vendedores V1 
    														 Where V.Codigo < V1.Codigo 
    														 Order By V.Codigo) As V2
    )
    Select SellerName, Sum(Tempo) As SomaDoTempo 
    From CTEDiferencaFornecedores2012
    Group By Sellername
    Order By Sellername
    Go
    
    -- Identificando o próximo vendedor utilizando a Função Lead() e calculando a diferença através da Função DateDiff() --
    Select V.SellerName, V2.SellerName, 
               V.TimeSeller,
    		   V2.TimeSeller As 'TimeSellerProximo',
    		   IsNull(DateDiff(dd, V.TimeSeller, Lead(V.TimeSeller) Over(Order By V.Codigo)),0) As 'Diferença em Dias'
    From Vendedores V Outer Apply (Select Top 1 Codigo, SellerName, TimeSeller From Vendedores V1
                                                              Where V.Codigo < V1.Codigo
    														  Order By V.Codigo) As V2
    Go
    
    -- Agrupando --
    ;With CTEDiferencaFornecedores (SellerNameAtual, SellerNameProximo, TimeSellerAnterior, TimeSellerProximo, DiferencaEmDias)
    As
    (
    Select V.SellerName, V2.SellerName, 
               V.TimeSeller,
    		   V2.TimeSeller,
    		   IsNull(DateDiff(dd, V.TimeSeller, Lead(V.TimeSeller) Over(Order By V.Codigo)),0)
    From Vendedores V Outer Apply (Select Top 1 Codigo, SellerName, TimeSeller From Vendedores V1
                                                              Where V.Codigo < V1.Codigo
    														  Order By V.Codigo) As V2
    )
    Select Concat(SellerNameAtual,' - ', SellerNameProximo) As SellerName,
    			Sum(DiferencaEmDias) As Somatoria
    From CTEDiferencaFornecedores
    Group By SellerNameAtual, SellerNameProximo 
    Order By Somatoria
    Go

    -- Calculando a diferença entre datas desconsiderando os sábados e domingos:

    declare @Data datetime set @Data = '2020/01/01'
    
     
     
    --Calcula a quantidade de dias entre a data inicial e a data atual, excluindo sbados e domingos soma 1 no fim pois no conta o proprio dia
    
     
     
    WITH AllDates AS
    
     
     
    (   SELECT  TOP (DATEDIFF(DAY, @Data, GETDATE()))
    
     
     
    D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @Data)
    
     
     
    FROM    sys.all_objects a
    
     
     
    CROSS JOIN sys.all_objects b
    
     
     
    )
    
     
     
    SELECT  WeekDays = COUNT(*) +1 -
    
     
     
    --Clcula a quantidade de feriados entre as datas
    
     
     
     
    (select count(*) from FTAFE(NOLOCK)
    
     
     
    where convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112) between @Data and GETDATE()
    
     
     
    and FTAFE.CD_CIDADE in(0)
    
     
     
    and DATEPART(weekday, convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112)  ) not in(6,7))
    
     
     
    FROM    AllDates
    
     
     
    WHERE   DATEPART(WEEKDAY, D) NOT IN(6, 7)
    Go
    
    
    Ressalto mais uma vez que estes são exemplos, peço que verifique, veja qual poderá lhe ajudar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 25 de junho de 2020 18:31
  • tem q tratar tecnico? entao testa

    select [Técnico],data_entrada,hora_entrada,datediff(mm,lag(hora_entrada)over(partition by [Técnico],data_entrada order by hora_entrada),hora_entrada) Tempo from tabela

    segunda-feira, 29 de junho de 2020 11:01