none
Dúvida em consulta com data RRS feed

  • Pergunta

  • Olá,

     

    Preciso fazer uma consulta com data vejam meu código:

     

    select tbCliente.Nome as Cliente, tbAgendamento.DataMarcacao, tbAgendamento.HoraConsulta,

    tbAgendamento.Solicitante, tbAgendamento.StatusServico, tbFuncionario.Nome as Dentista

             from tbAgendamento

             inner join tbCliente on tbAgendamento.idCliente = tbCliente.idCliente

             inner join tbFuncionario on tbAgendamento.idDentista = tbFuncionario.idFunc

    where

            convert(char(10),tbAgendamento.HoraConsulta,103)= convert(char(10), @CData,103)

    order by tbAgendamento.HoraConsulta

     

    onde CData é uma variável declara com datetime. O problema é que quando rodo o sql, não mostra nada mas se eu colocar uma data no local de CData('15/04/2008' por exemplo), funciona.

     

    Alguma dica.....

     

    Obrigado

     

    terça-feira, 15 de abril de 2008 15:40

Respostas

  • Boa Tarde,

     

    A primeira e mais valiosa dica é: "Abandone definitivamente a utilização de funções como CONVERT e CAST sobre campos em cláusulas WHERE a menos que excepcionalmente necessário".

     

    Toda vez que você coloca CONVERT e CAST em um campo, automaticamente os índices serão desprezados e haverá um table scan se outras condições não estiverem presentes.

     

    No caso de datas opte sempre por trabalhar no formato YYYYMMDD e você não terá problemas com regional settings, default language, set dateformat ou qualquer outra configuração vigente.

     

    Tente fazer o seguinte

     

    Code Snippet

    DECLARE @CData SMALLDATETIME

    SET @CData = '20080415'

    select tbCliente.Nome as Cliente, tbAgendamento.DataMarcacao, tbAgendamento.HoraConsulta,

    tbAgendamento.Solicitante, tbAgendamento.StatusServico, tbFuncionario.Nome as Dentista

    from tbAgendamento

    inner join tbCliente on tbAgendamento.idCliente = tbCliente.idCliente

    inner join tbFuncionario on tbAgendamento.idDentista = tbFuncionario.idFunc

    where

    tbAgendamento.HoraConsulta >= @CData AND tbAgendamento.HoraConsulta < @CData + 1

    --convert(char(10),tbAgendamento.HoraConsulta,103)= convert(char(10), @CData,103)

    order by tbAgendamento.HoraConsulta

     

     

    Esse código já contempla situações em que a data representa um momento do dia (ex: 15/04/2008 14:00)

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 15 de abril de 2008 16:30
  • OK meu caro....muito obrigado

     

    terça-feira, 15 de abril de 2008 17:04

Todas as Respostas

  • Gilberto,

     

    Em qual parte do seu código você esta declarando esta variável?

    terça-feira, 15 de abril de 2008 16:29
  • Boa Tarde,

     

    A primeira e mais valiosa dica é: "Abandone definitivamente a utilização de funções como CONVERT e CAST sobre campos em cláusulas WHERE a menos que excepcionalmente necessário".

     

    Toda vez que você coloca CONVERT e CAST em um campo, automaticamente os índices serão desprezados e haverá um table scan se outras condições não estiverem presentes.

     

    No caso de datas opte sempre por trabalhar no formato YYYYMMDD e você não terá problemas com regional settings, default language, set dateformat ou qualquer outra configuração vigente.

     

    Tente fazer o seguinte

     

    Code Snippet

    DECLARE @CData SMALLDATETIME

    SET @CData = '20080415'

    select tbCliente.Nome as Cliente, tbAgendamento.DataMarcacao, tbAgendamento.HoraConsulta,

    tbAgendamento.Solicitante, tbAgendamento.StatusServico, tbFuncionario.Nome as Dentista

    from tbAgendamento

    inner join tbCliente on tbAgendamento.idCliente = tbCliente.idCliente

    inner join tbFuncionario on tbAgendamento.idDentista = tbFuncionario.idFunc

    where

    tbAgendamento.HoraConsulta >= @CData AND tbAgendamento.HoraConsulta < @CData + 1

    --convert(char(10),tbAgendamento.HoraConsulta,103)= convert(char(10), @CData,103)

    order by tbAgendamento.HoraConsulta

     

     

    Esse código já contempla situações em que a data representa um momento do dia (ex: 15/04/2008 14:00)

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 15 de abril de 2008 16:30
  • De qualquer forma, comigo funcionou.

    Code Snippet

    DECLARE @CData DateTime
    SET @CData = getdate()
    SELECT 'Ok' AS Sucesso WHERE CONVERT(Char(10),@
    CData,103) = '15/04/2008'


    []s.
    terça-feira, 15 de abril de 2008 16:41
  • Gustavo,

     

    Sua solução funcionou mas o que significa + 1 ????

     

    Obrigado.

     

    terça-feira, 15 de abril de 2008 16:52
  • Olá Gilberto,

     

    Se suas datas forem armazenadas sem o horário (ex: 20080415) basta fazer uma igualdade (ex: Data = @Data).

     

    No entanto, se suas datas contemplarem o horário (ex: 20080415 14:00) a igualdade não irá retornar nada já que 20080415 é diferente de 20080415 14:00

     

    Dessa forma com o +1 estou comparando todas as datas no intervalo 20080415 e 20080416 considerando o horário 20080415 00:00 e sem considerar 20080416 00:00. Isso é equivalente a recuperar todos os registros do dia 15.

     

    Gosto dessa implementação porque além de mais performática que o CONVERT ela mais flexível e imune a configurações de formato DMY, MDY, etc

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 15 de abril de 2008 17:01
  • OK meu caro....muito obrigado

     

    terça-feira, 15 de abril de 2008 17:04