Usuário com melhor resposta
Dúvida em consulta com data

Pergunta
-
Olá,
Preciso fazer uma consulta com data vejam meu código:
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.HoraConsultaonde 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
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 SnippetDECLARE
@CData SMALLDATETIMESET
@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.idFuncwhere
tbAgendamento
.HoraConsulta >= @CData AND tbAgendamento.HoraConsulta < @CData + 1 --convert(char(10),tbAgendamento.HoraConsulta,103)= convert(char(10), @CData,103)order
by tbAgendamento.HoraConsultaEsse código já contempla situações em que a data representa um momento do dia (ex: 15/04/2008 14:00)
[ ]s,
Gustavo
-
Todas as 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 SnippetDECLARE
@CData SMALLDATETIMESET
@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.idFuncwhere
tbAgendamento
.HoraConsulta >= @CData AND tbAgendamento.HoraConsulta < @CData + 1 --convert(char(10),tbAgendamento.HoraConsulta,103)= convert(char(10), @CData,103)order
by tbAgendamento.HoraConsultaEsse código já contempla situações em que a data representa um momento do dia (ex: 15/04/2008 14:00)
[ ]s,
Gustavo
-
-
-
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
-