none
obter dias e horas - datas RRS feed

  • Pergunta

  • olá a todos,

    precisava de ajuda numa questão que involve datas.

    quero ver o tempo que passou desde que efetuei determinada accao -na bd tenho a data- em determinado momento

    por exemplo:

    ex1 : ultima accao = '2019-12-03 11:30:00'

    ora, no momento que efetu-o a pesquisa(2019-12-03 14:15:00), passou 1 dia e 3 horas


    ex2 : ultima accao = '2019-12-03 17:30:00'

    ora, no momento que efetu-o a pesquisa2019-12-03 14:15:00), passou 0 dia e 21 horas


    como posso obter estes dados?

    obrigado

    espero ter ajudado.

    quarta-feira, 4 de dezembro de 2019 14:25

Respostas

  • Boa tarde,

    Luis, experimente fazer uns testes adaptando o trecho abaixo:

    with CTE_Dif as
    (
        select
            DATEDIFF(HOUR, '2019-12-03 17:30:00', '2019-12-04 14:15:00') AS DifHoras
    )
    
    select
        CAST(DifHoras / 24 as varchar(5)) + ' dia(s) e ' +
        CAST(DifHoras % 24 as varchar(2)) + ' hora(s)'
    from CTE_Dif    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta LuisMLPinto quarta-feira, 4 de dezembro de 2019 16:24
    quarta-feira, 4 de dezembro de 2019 15:27

Todas as Respostas

  • Luis

    Voce tem uma tabela com a auditoria da ultima pesquisa? se sim, basta usar a funcao datediff

    SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
    FROM dbo.Tabela;

    Caso você nao tenha a data inicial para comparar, você precisa criar um mecanismo de auditoria para capturar quando foi a ultima consulta.


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS, MCITP, MCT e MVP.
    Se Útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 4 de dezembro de 2019 15:24
    Moderador
  • Boa tarde,

    Luis, experimente fazer uns testes adaptando o trecho abaixo:

    with CTE_Dif as
    (
        select
            DATEDIFF(HOUR, '2019-12-03 17:30:00', '2019-12-04 14:15:00') AS DifHoras
    )
    
    select
        CAST(DifHoras / 24 as varchar(5)) + ' dia(s) e ' +
        CAST(DifHoras % 24 as varchar(2)) + ' hora(s)'
    from CTE_Dif    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta LuisMLPinto quarta-feira, 4 de dezembro de 2019 16:24
    quarta-feira, 4 de dezembro de 2019 15:27
  • olá, tentei fazer com datediff, mas preciso de saber o nº de dias e de horas.

    so que se fizer por exemplo:

    data1 = '2019-12-03 14:50:00'

    data1 = getdate()

    no nº de dias dá 1, nas horas dá 23.

    ora o correto é ser 1 dia e 1 hora.

    e depois nos casos em que ainda nao passou um dia como exemplo2 do 1º post fica mais complicado, dai ter pedido ajuda.

    obrigado


    espero ter ajudado.

    quarta-feira, 4 de dezembro de 2019 15:32
  • muito obrigado gapimex.

    espero ter ajudado.

    quarta-feira, 4 de dezembro de 2019 16:26
  • Deleted
    quarta-feira, 4 de dezembro de 2019 16:35
  • LuisMLPinto,

    Veja se este outro exemplo pode também contribuir para sua solução:

    Declare @Datas Table 
     (DataInicial DateTime2, 
      DataFinal DateTime2)
    
    Insert Into @Datas 
    Values (GetDate(), GetDate()+1),
           (GetDate(), '2019-12-06 20:45:15')
    
    ;With TotalSegundos (Dias, Segundos)
    As 
    ( 
      Select DateDiff(Day,DataInicial, DataFinal) As Dias, 
             Sum(DateDiff(ss,DataInicial, DataFinal)) As Segundos
      From @Datas
      Group By DataInicial, DataFinal
    ),
    
    Resultados 
    As 
    (
     Select Dias, 
            (Segundos / 3600) as Horas,
            (Segundos % 3600) / 60 as Minutos,
            (Segundos % 3600) % 60 as Segundos
     From TotalSegundos)
    
    
    Select Concat(Dias, ' dia(s) ', Horas, 'hr(s) ', Minutos, 'min(s) ', Segundos, 'seg(s)') As Diferenca
    From Resultados
    Go

    Utilizo em algumas situações, não validei se o mesmo se encaixa para sua necessidade.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 4 de dezembro de 2019 17:45
  • Deleted
    quarta-feira, 4 de dezembro de 2019 18:24
  •  

    O código SQL acima retorna resultados errados.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Muito obrigado, estava errado mesmo, agradeço imensamente a sua preocupação.

    Estou postando outro.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 4 de dezembro de 2019 18:44
  • LuisMLPinto,

    Graças a verificação realizada pelo José Diz, identificou que o meu Código de exemplo continha um erro, estou compartilhando outro exemplo:

    Declare @Datas Table 
     (DataInicial DateTime, 
      DataFinal DateTime)
    
    Insert Into @Datas 
    Values (GetDate(), GetDate()+1),
           (GetDate(), '2019-12-06 20:46:15')
    
    ;With TotalHoras (Horas)
    As 
    ( 
      Select DateDiff(Hour,DataInicial, DataFinal) As Segundos From @Datas
    ),
    
    Resultados 
    As 
    (
     Select 
            (Horas / 24) As Dias,
            (Horas % 24) As Horas,
            (Horas % 3600) / 60 As Minutos,
            (Horas % 3600) % 60 As Segundos
     From TotalHoras)
    
    
    Select Concat(Dias, ' dia(s) ', Horas, 'hr(s) ', Minutos, 'min(s) ', Segundos, 'seg(s)') As Diferenca
    From Resultados
    Go
    Espero que de alguma forma possa estar colaborando, valide e veja se te ajuda.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 4 de dezembro de 2019 18:46
  • Deleted
    quarta-feira, 4 de dezembro de 2019 20:26

  • Embora o código SQL acima se pareça muito com o que "gapimex" propôs neste tópico, ainda assim continua errado: não há como gerar minutos e segundos a partir de uma informação cuja granularidade seja horas.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Caro José,

    Você esta certo, o meu "exemplo" esta parecido com o do Gapimex, bem como, realmente o valor dos minutos e segundos estavam sendo calculados com a granularidade errada, não declarei a variável correta.

    Da mesma forma que da outra vez, agradeço a sua preocupação e ajuda.

    Vou compartilhar outra versão.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 4 de dezembro de 2019 21:49
  • LuisMLPinto,

    Segue outro exemplo contendo as observações apresentações anterior:

    Declare @Datas Table 
     (DataInicial DateTime, 
      DataFinal DateTime)
    
    Insert Into @Datas 
    Values (GetDate(), GetDate()+1),
           (GetDate(), '2019-12-06 20:46:15')
    
    ;With TotalHoras (Horas, Minutos)
    As 
    ( 
      Select DateDiff(Hour,DataInicial, DataFinal) As Horas,
             DateDiff(ss,DataInicial, DataFinal) As Minutos
      From @Datas
    ),
    
    Resultados (Dias, Horas, Minutos, Segundos)
    As 
    (
     Select 
            (Horas / 24) As Dias,
            (Horas % 24) As Horas,
            (Minutos % 3600) / 60 As Minutos,
            (Minutos % 3600) % 60 As Segundos
     From TotalHoras)
    
    
    Select Concat(Dias, ' dia(s) ', Horas, 'hr(s) ', Minutos, 'min(s) ', Segundos, 'seg(s)') As Diferenca
    From Resultados
    Go


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 4 de dezembro de 2019 22:01
  • Boa tarde,

    Luis, experimente fazer uns testes adaptando o trecho abaixo:

    with CTE_Dif as
    (
        select
            DATEDIFF(HOUR, '2019-12-03 17:30:00', '2019-12-04 14:15:00') AS DifHoras
    )
    
    select
        CAST(DifHoras / 24 as varchar(5)) + ' dia(s) e ' +
        CAST(DifHoras % 24 as varchar(2)) + ' hora(s)'
    from CTE_Dif    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Gapimex,

    Esqueci de pedir licença e autorização para usar o seu exemplo no meus posts.

    Mas estou fazendo aqui publicamente, afim de evitar problemas e fazer jus aos direitos autorais.

    Até mais.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 5 de dezembro de 2019 02:25
  • Deleted
    quinta-feira, 5 de dezembro de 2019 07:50

  •  

    Como citado em resposta anterior, é tudo questão de granularidade. A resposta de "gapimex", por exemplo, utilizou "hour" como parâmetro na função datediff() pois na resposta dele a granularidade é horas. Já o código SQL que transcrevi na resposta que postei utiliza a granularidade de segundos; e todos os cálculos foram feito considerando-se essa unidade. O que o Luís pediu foi dias e horas e nisso a resposta do "gapimex" atende. Quanto ao código SQL acima por você postado, ele continua errado e a causa está justamente na mistura de granularidades para calcular tempo decorrido; dependendo do conjunto de dados os cálculos de dias e/ou horas ficam errados no código acima e causa está explicada na documentação da função datediff().

    ---

    Além das abordagens de dias/horas e dias/horas/minutos/segundos, uma terceira abordagem é dias/horas/minutos, em que uma possibilidade é a seguinte:

    -- código #2
    with CalcHMS as (
    SELECT UltimaAccao, Agora,
           datediff (minute, UltimaAccao, Agora) as DifMin
      from tabela
    )  
    SELECT UltimaAccao, Agora,
           (DifMin / 1440) as Dias,
           ((DifMin / 60) % 24) as Horas,
           (DifMin % 60) as minutos
      from CalcHMS;

     

    E utilizando a estrutura do código #2 pode-se ter a seguinte versão simplificada do código #1:

    -- código #3
    with CalcHMS as (
    SELECT UltimaAccao, Agora, 
           datediff_big (second, UltimaAccao, Agora) as DifSeg
      from tabela
    )  
    SELECT UltimaAccao, Agora, 
           (DifSeg / 86400) as Dias,
           ((DifSeg / 3600) % 24) as Horas,
           ((DifSeg / 60) % 60) as Minutos,
           (DifSeg % 60) as Segundos
      from CalcHMS;
    Substituir datediff_big por datediff para versões anteriores a 2016 do SQL Server.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Ok, obrigado por suas observações.

    Eu entendi, concordo com o que você relatou: "Como citado em resposta anterior, é tudo questão de granularidade. A resposta de "gapimex", por exemplo, utilizou "hour" como parâmetro na função datediff() pois na resposta dele a granularidade é horas. Já o código SQL que transcrevi na resposta que postei utiliza a granularidade de segundos; e todos os cálculos foram feito considerando-se essa unidade. O que o Luís pediu foi dias e horas e nisso a resposta do "gapimex" atende. Quanto ao código SQL acima por você postado, ele continua errado e a causa está justamente na mistura de granularidades para calcular tempo decorrido; dependendo do conjunto de dados os cálculos de dias e/ou horas ficam errados no código acima e causa está explicada na documentação da função datediff()."

    Eu somente estou apresentando uma outra forma dele tentar obter possibilidades de resultado, não estou sinceramente me preocupando se o resultado que vai ser apresentado é o correto, isso é algo que nunca vamos poder afirmar, pois cada post é um cenário único e específico, o nosso papel aqui é tentar mostrar as alternativas e variações possíveis.

    No que tange as granularidades, tenho plena conciência das possibilidades e variações dos resultados, por isso eu sempre destaco e relato que é um exemplo, uma possibilidade, uma alternativa, jamais poderei afirmar ou dar a certeza que as respostas aqui apresentadas por todos nós serão sempre as corretas, acertivas e precisas.

    Mesmo assim, de forma respeitosa eu concordo com as suas observações, sugestões e conclusões.

    Obrigado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | 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, 5 de dezembro de 2019 10:42