Consulta com Datas no Delphi x Access qual o segredo...?
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!!!
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
Curtidas 0
Respostas
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)´
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
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ãoo 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:
...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ã?
[*:f3d062e7d9]Você quer todos que estão jogando agora a tarde?
...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)
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) {...}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