none
Comparando data e hora em campos diferentes RRS feed

  • Pergunta

  • Tenho uma tabela que contem os seguintes campos nome do tipo (nvarchar), Data do tipo (Date)e hora do tipo (Time).

    Preciso fazer a comparação por período exemplo: 08-02-2019 e 18:30:10 até 30-05-2019 e 07:45:11

    Como faço isso na consulta em sql server

    Estava tentando dessa forma mas sei que não funciona:

    SELECT        pessoa.nome, acesso.data, acesso.hora
    FROM            acesso 
    INNER JOIN pessoa ON acesso.id_pessoa = pessoa.id
    WHERE        (acesso.data >= @data1) AND (acesso.data <= @data2) and   (acesso.hora >= @horaInicio and acesso.hora <= @horafim)



    quinta-feira, 30 de maio de 2019 14:35

Respostas

  • Bom dia,

    Renato, experimente fazer uns testes dessa forma:

    where 
        dateadd(second, datediff(second, 0, acesso.hora), cast(acesso.data as datetime2)) 
            between @DataHoraIni and @DataHoraFim

    Espero que ajude


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

    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:38
    quinta-feira, 30 de maio de 2019 14:51
  • Renato,

    O seu ambiente é similar a este exemplo?

    Create Table DatasHoras 
     (Codigo TinyInt Identity (1,1) Primary Key,
      Data Date,
      Hora Time)
    Go
    
    Insert Into DatasHoras Values ('2019-01-25','10:30:15'),('2019-02-25','11:30:00'),
                                  ('2019-03-01','09:15:00'),('2019-03-31','20:25:00'),
                                  ('2019-04-05','15:40:22')
    Go
    
    Select * From DatasHoras
    Go
    
    -- Pesquisando os dados --
    -- Exemplo 1 --
    Select Codigo, Data, Hora
    From DatasHoras
    Where Data BetWeen '2019-02-25' And '2019-03-31'
    Go
    
    -- Exemplo 2 --
    Select Codigo, Data, Hora
    From DatasHoras
    Where Concat(Data,Hora) >= '2019-02-25 11:30:00' And Concat(Data,Hora) <= '2019-03-31 09:15:00'
    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]

    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:38
    quinta-feira, 30 de maio de 2019 15:07
  • Deleted
    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:39
    quinta-feira, 30 de maio de 2019 15:15
  • Deleted
    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:39
    quinta-feira, 30 de maio de 2019 15:26

Todas as Respostas

  • Renato,

    Vamos lá, algumas perguntas para nos orientarmos:

    1- Os valores que estão sendo passados nas variáveis @Data1, @Data2, @HoraInicio e @HoraFim, estão sendo tratados como Varchar(), Char(), Date ou Time?

    2 - As colunas Data e Hora, estão definidas na estrutura da tabela com qual tipo de dados respectivamente: Date, DateTime ou Time?

    3 - Como você esta utilizando o operador And para todas as condições, temos um cenário que se uma das possíveis condições foram inválidas todo o resto será, sendo assim, talvez para ter uma amostra do retorno dos dados poderíamos executar por partes da forma que esta, ou fazer uso do operador OR.


    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, 30 de maio de 2019 14:47
  • Bom dia,

    Renato, experimente fazer uns testes dessa forma:

    where 
        dateadd(second, datediff(second, 0, acesso.hora), cast(acesso.data as datetime2)) 
            between @DataHoraIni and @DataHoraFim

    Espero que ajude


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

    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:38
    quinta-feira, 30 de maio de 2019 14:51
  • Bom dia, gapimex. 

    Nas variáveis  DataHoraIni e DataHoraFim vc concatenou os valores  Data mais hora 

    quinta-feira, 30 de maio de 2019 15:01
  • Renato,

    O seu ambiente é similar a este exemplo?

    Create Table DatasHoras 
     (Codigo TinyInt Identity (1,1) Primary Key,
      Data Date,
      Hora Time)
    Go
    
    Insert Into DatasHoras Values ('2019-01-25','10:30:15'),('2019-02-25','11:30:00'),
                                  ('2019-03-01','09:15:00'),('2019-03-31','20:25:00'),
                                  ('2019-04-05','15:40:22')
    Go
    
    Select * From DatasHoras
    Go
    
    -- Pesquisando os dados --
    -- Exemplo 1 --
    Select Codigo, Data, Hora
    From DatasHoras
    Where Data BetWeen '2019-02-25' And '2019-03-31'
    Go
    
    -- Exemplo 2 --
    Select Codigo, Data, Hora
    From DatasHoras
    Where Concat(Data,Hora) >= '2019-02-25 11:30:00' And Concat(Data,Hora) <= '2019-03-31 09:15:00'
    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]

    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:38
    quinta-feira, 30 de maio de 2019 15:07
  • Olá Junior Galvão, bom dia.

    1. Os valores estão correspondendo aos tipos de campo, exemplo @data1 Date, @horaInicio  Time  etc..

    2. A data esta como Date e a hora esta como Time.

    3. Eu também pensei assim, mas da forma que está como a busca esta por período muitos registro e até mesmo nenhum registro apareceria no relatório por causa da hora. Se o campo vc um Datime seria mais fácil...rs mas o banco é de terceiro e já esta super populado ai não posso mudar a estrutura.    

    quinta-feira, 30 de maio de 2019 15:09
  • Renato, naquela sugestão que postei @DataHoraIni e @DataHoraFim seriam do tipo datetime2 ou semelhante e conteriam a data e a hora juntos.

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

    quinta-feira, 30 de maio de 2019 15:11
  • Renato,

    Certo, estamos se referindo a qual versão do SQL Server?

    Se for 2012 ou superior acredito que o exemplo utilizando a função Concat possa te ajudar, pois como você destacou esta trabalhando com os tipos de dados específicos para armazenar semanticamente correto os dados.


    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, 30 de maio de 2019 15:13
  • Deleted
    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:39
    quinta-feira, 30 de maio de 2019 15:15
  • Deleted
    • Marcado como Resposta Renato B Lima quinta-feira, 30 de maio de 2019 16:39
    quinta-feira, 30 de maio de 2019 15:26
  • Boa tarde Pessoal, estou passando para dar o feedback e dizer que todas as soluções que vocês me passaram funcionaram perfeitamente. Vocês são muito feras, parabéns pelo trabalho e desempenho aqui nos fóruns.    
    quinta-feira, 30 de maio de 2019 16:38
  • Renato,

    Obrigado por feedback.


    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, 30 de maio de 2019 16:44
  • Deleted
    quinta-feira, 30 de maio de 2019 18:29