Consulta com Datas no Delphi x Access qual o segredo...?

Delphi

25/02/2004

Ola Galera...

Estou meio revoltado ...rs, prometi um sistema de Lan House pra um camarada meu e ele veio falar em cima da hora que ele ia inaugurar a parada neste final de semana,
no sábado pra ser mais preciso. Pra quebrar o galho do cara fiquei o carnaval inteiro trabalhando todos os dias, e quando foi ontém quando faltava somente um relatório com data inicial e data final, e hora inicial e Hora Final. O cara quer saber qual é o horário que de maior fluxo de cliente no seu estabelecimento.

Então ele vai escolher a data que ele quer saber e eu separei os horários por período
minha query ficou a seguinte

// SELECIONA CLIENTES DO FLUXO DA MANHÂ

Select a.Cd_Cliente,
b.Nm_Cliente,
a.Dt_Locacao,
a.HoraEntrada,
a.HoraSaida

From Tab_Locacao a,
Tab_Clientes b

Where a.Cd_Cliente = b.Cd_Cliente and
a.Dt_Locacao Between ´ + FormatDateTime(´dd/mm/yyyy´,DtPicker_Inicial.DateTime) + ´ and ´ + FormatDateTime(´dd/mm/yyyy´,DtPicker_Final.DateTime) + ´ and ´ +
a.HoraEntrada Between ´ + 09:00:00 and 12:00:00´

depois se desse certo essa query eu faria a mesma query com horários (Período da Tarde = 12:01:00 até 17:00:00 e Noite 17:01:00 até 21:00:00).


A query não funciona de jeito nenhum galera, desculpae ter digitado muita coisa preferi deixar bem explicado ok. Se puderem me ajudar agredeço!!!


Info.wtomfs

Info.wtomfs

Curtidas 0

Respostas

Luineumann

Luineumann

25/02/2004

experimente

Where (a.Cd_Cliente = b.Cd_Cliente) and
(a.Dt_Locacao Between #´ + FormatDateTime(´mm/dd/yyyy´,DtPicker_Inicial.DateTime) + ´ and ´ + FormatDateTime(´mm/dd/yyyy´,DtPicker_Final.DateTime) + ´ ) and ´ +
(a.HoraEntrada Between 12/30/1899 09:0:0 And 12/30/1899 12:0:0)´


GOSTEI 0
Ildefonso

Ildefonso

25/02/2004

Olá, wtomfs (que que isso quer dizer?)...

O Lui lembrou um detalhe importate: o demarcador de datas e horas no Access (e em outros DBs) é a # (grade, sustenido, etc.).

Assim, como a data nos bancos de dados são armazenadas como números de precisão dupla (agora, 25/2/2004 15:57:49, é representado como 38.042,665150463 no Access, ou seja: estamos a 32.042 dias após a data zero, mais algumas frações de dia), quando você colocou a expressão
{...} a.Dt_Locacao Between ´ + FormatDateTime(´dd/mm/yyyy´,DtPicker_Inicial.DateTime) {...}
o Access tentou simplificar a expressão 02/25/2004, chegando a um resultado que significaria os primeiros instantes da data zero (precisamente 30/12/1899 00:00:03)...

Por isso usamos os delimitadores, tal como o Lui indicou.

Outro detalhe: ao usarmos [b:f3d062e7d9]Between[/b:f3d062e7d9] estaremos tratando entre datas inteiras... Ou seja, se você quer alguma data incluindo suas frações - 25/02/2004 16:00 - a expressão [b:f3d062e7d9]Between 02/25/2004 And 02/25/2004[/b:f3d062e7d9] não será capaz de ver aquela data do exemplo, porque o operador [b:f3d062e7d9]Between[/b:f3d062e7d9] vai desconsiderar as frações do segundo argumento (mesmo que, como neste caso, ambos os argumentos tenham valores iguais).

Para contornar esta característica, costumo usar os operadores [b:f3d062e7d9]>=[/b:f3d062e7d9] e [b:f3d062e7d9]<[/b:f3d062e7d9], pegando a data/hora limite superior e somando um para determinar qual é o valor máximo [b:f3d062e7d9]exclusive[/b:f3d062e7d9]. Ficou ´compricado´? Eu re-explico:[list:f3d062e7d9][*:f3d062e7d9]imagine que você quer listar algo entre 26/jan/2004 e 25/fev/2004;
[*:f3d062e7d9]estes valores ficaram armazenados, respectivamente, nas variáveis dtInical e dtFinal;
[*:f3d062e7d9]ao atribuir a variável [b:f3d062e7d9]expr[/b:f3d062e7d9] com a expressão:
 expr := ´a.Dt_Locacao >= #´ + FormatDateTime(´mm/dd/yyyy´, dtInicial) + 
        ´ AND a.Dt_Locacao < ´ + FormatDateTime(´mm/dd/yyyy´, dtFinal+1) + ´´

...nós estaríamos com parte da cláusula WHERE devidamente preparada[/list:u:f3d062e7d9]
Além de tudo isso, sugiro a você manter dois únicos campos de registro de data/tempo: Entrada e Saida...
Por que? Porque tudo estará fácil de localizar:
[list:f3d062e7d9][*:f3d062e7d9]Você quer quantas pessoas entraram no período de hoje de manhã?
 a.Entrada >= #02/25/2004 08:00 AND a.Entrada < 02/25/2004 12:00

[*:f3d062e7d9]Você quer todos que estão jogando agora a tarde?
 a.Entrada >= 02/25/2004 12:00 AND a.Entrada < 02/25/2004 18:00

...e assim por diante.[/list:u:f3d062e7d9]
Desta forma, inclusive, você poderia calcular a permanência de cada período, visto que se alguém entra hoje 02/25/2004 17:00 para sair só de madrugada, às 02/26/2004 02:30, a operação [b:f3d062e7d9]a.Saida - a.Entrada[/b:f3d062e7d9] lhe forneceria o tempo correto que ele esteve usando a máquina sem a necessidade de cálculos intermediários.

Finalmente - antes que desistam de ler o resto, de uma olhada no [i:f3d062e7d9]Help[/i:f3d062e7d9] do próprio Access sobre os campos Data/Hora... Há inúmeros exemplos de formatação e operações com tais valores.

Bom trabalho. 8)


GOSTEI 0
POSTAR