Bom, estou aqui novamente para esclarecer algumas coisas sobre o artigo  que escrevi anteriormente, após o artigo “Como Trabalhar com Data e  Moeda no Delphi/Interbase”, recebi vários email´s e conheci muitas  pessoas no MSN, por isso estou aqui novamente para dar mais uma pequena  contribuição à comunidade Delphi e lembrando que é para iniciantes,  programadores avançados talvez achem até sem importância para eles mas  para mim foi crucial e deve ser também para outras pessoas.
Eu sei  que esse assunto é no mínimo chato, mas mesmo assim vamos lá. Dessa vez  vou abordar apenas datas que dão uma grande dor de cabeça no Interbase,  acabo de desenvolver dois programas, um de controle de membros e  colaboradores de uma Igreja e o outro para Tabelionato de Notas, apesar  de serem completamente diferentes, consegui ao desenvolver os dois tirar  muitas dúvidas sobre datas, por exemplo, Cartórios de Notas, todas as  autenticações e demais atos que são feitos são recolhidos para o Estado  (SecFaz, IPESP, etc.) e isso gera uma guia conhecida como GARE, que o  cartório é obrigado a preencher diariamente, e para isso é preciso  contar todos os atos realizados no dia, pegar o valor correspondente e  multiplicar, além disso, escrever todo o conteúdo no campo de descrição  da guia.
Com o software que eu desenvolvi, isso ficou muito fácil, pois todos  esses dados estão em apenas uma tabela, é só dar um select, jogar os  valores encontrados em campos pré-definidos (tipo EditQAut.text,  EditvlAut.text) ou também em variáveis do tipo double fazendo as contas  usando as velhas equações de 1º e 2º grau, aí é só pegar os dados  encontrados e jogados nos edits correspondentes e mandar escrever em um  campo qualquer: 
Exemplo: 
Na tabela DIARIO, existem os campos: Q_Aut Integer, Vl_Aut Numeric(9,2) e  Data Date: (o campo “Q_aut”, serve para guardar a quantidade total de  autenticações realizadas no dia; o campo “Vl_Aut”, para guardar a  multiplicação dessas autenticações pelo preço unitário, que por sua vez é  armazenado em uma outra tabela que chamei de CUSTAS, mas não vem ao  caso, e o campo Data para guardar o dia que foi realizado as  autenticações). 
Em tempo: esses valores são encontrados previamente pelo cliente através  de cálculos e opções fornecidas pelo software, entenda que estamos  trabalhando já com o valor final, e não unitário tipo PDV que registra  um-a-um, é como se já se tivesse fechado o caixa e estivesse querendo  gerar um relatório com os dados finais. 
Primeiro passo, dar um select para saber os dados do dia: 
Var 
C:string;
begin
C:=('select * from Diario where (Data = '#39+editdata.text+#39')');
IBQuery1.SQL.clear;
IBQuery1.sql.add(c);
IBQuery1.Open;
while IBQuery1.Eof = false do
begin 
EditQAut.text:= IBQuery1.fieldbyname('Q_Aut').AsString;
EditVlAut.text:= IBQuery1.fieldbyname('Vl_Aut').AsString;
end;
end;
A declaração da variável “C: string” poderia ser de modo global, para  não se repetir esse comando, dessa forma, o programa iria exibir nos  edits em questão os valores contidos na tabela DIARIO. Aí logo após eu  precisei escrever esses dados por extenso em um memo chamado  “Mdescricao” e ficou desta forma: 
MDescricao.text:= 'Hoje tiveram '+EditQAut.text+' Autenticações, que no total somou R$ '+EditvlAut.text;  
Resolvi meu primeiro problema facilmente, bem simples, pois esta tudo na  tabela chamada DIARIO, a Data, a Quantidade total do dia e o Valor  Total, o “X” da questão foi quando me disseram que a guia que é gerada  para instituição chamada IPESP não é diária, é semanal. Putz, como fazer  um select entre duas datas e ainda por cima somando quantidades  inteiras e valores monetários?????. Lí um e-mail que me fizeram essa  mesma pergunta só que utilizando Acces, já havia lido vários artigos e  dicas pela net e percebi que a resposta já estava lá, apenas precisava  ser mais bem trabalhada, então achei uma solução: 
Primeiro eu tinha que informar o dia inicial e o dia final, pois não  encontrei funções para que o Interbase descobrisse isso pra mim, então  adicionei ao form dois Maskedit´s (EditDataInicial.text e  EditDataFinal.text), que serviram para informar no caso a Segunda-Feira e  Sexta-Feira respectivamente, isso se não tiver feriado é claro, a  partir daí criei um select com aquela função SUM, que serve para somar  valores direto na base de dados, não esquecendo também de criar duas  variáveis do tipo Tdate para armazenar as datas no formato americano (  D_inicial, D_Final).  
Var 
D_Inicial, D_Final : Tdate;
begin
{Guardar as datas nas variáveis}
D_Inicial:= StrtoDate(EditDataInicial.text);
D_Final:= StrtoDate(EditDataFinal.text);
{formatar para o formato americano}
ShorDateFormat:= ‘mm/dd/aaaa’;
{jogar as datas de volta nos Maskedits já formatadas} 
EditDataInicial.text:= DatetoStr(D_Inicial);
EditDataFinal.text:= DatetoStr(D_Final);
C:=('select Sum(Q_Aut) AS Tot_Aut from Diario where (data >=  '#39+EditDataInicial.Text+#39') and (data <=  '#39+EditDataFinal.Text+#39')'); 
IBQuery1.SQL.clear;
IBQuery1.sql.add(c);
IBQuery1.Open;
while IBQuery1.Eof = false do
begin 
EditTotal.text:= IBQuery1.fieldbyname('Tot_Aut').AsString;
{retornar para o formato brasileiro}
ShorDateFormat:= ‘dd/mm/aaaa’;
{joga o valor das datas novamente nos edits só que no formato dd/mm/aaaa}
EditDataInicial.text:= DatetoStr(D_Inicial);
EditDataFinal.text:= DatetoStr(D_Final);
end;
end;
Assim descobri a quantidade total de autenticações da semana, para  descobrir a soma dos valores é só mudar o campo “Q_Aut” por “Vl_Aut”,  assim ele irá somar os valores e não as quantidades. Claro que tudo isso  pode ser feito em apenas um Select com declarações compostas utilizando  aquela opção de Select-dentro-de-Select (SubSelect), aí é só quebrar a  cabeça e resolver. Existem outras formas de fazer isso tudo que eu fiz  diminuindo consideravelmente à quantidade de linhas de comandos, mas  expliquei desse jeito passo-a-passo para entendermos melhor como  funciona o Interbase com relação a datas. 
Explicando o código: 
Primeiro eu declarei duas variáveis do tipo “Tdate” [D_Inicial, D_Final]  para armazenar as datas informadas nos MaskEdits [EditDataInicial.text e  EditDataFinal.text], o que acontece, quando digitamos 13/12/2004 e  17/12/2004 respectivamente, isso é de Segunda a Sexta, ele vai pegar e  alterar 13/12/2004 e 17/12/2004 por 12/13/2004 e 12/17/2004  respectivamente e jogar de volta no Maskedit, ai ele faz a comparação na  base de dados já no formato que o Interbase entende mm/dd/aaaa  (Mês/Dia/Ano), após isso é feito o select somando a quantidade  encontrada [SUM(Q_Aut)] verificando as datas e retornando somente os  registros que forem maiores ou iguais que 12/13/2004 e menores ou igual  que 12/17/2004 [where (Data >= '#39+EditDataInicial.text+#39') and  (Data <= '#39+EditDataFinal.text+#39'], assim ele vai verificar todos  e trazer para os edits indicados, após isso, mudei novamente o formato  da data para o formato brasileiro [ShorDateFormat:= ‘dd/mm/aaaa’] e  mandei jogar os valores das respectivas datas nos Maskedits de novo, aí  ele desfaz 12/13/2004 e 12/17/2004 por 13/12/2004 e 17/12/2004  respectivamente, ou seja, assim o delphi faz todo o trabalho de  conversão para você sem maiores preocupações com o formato que foi  digitado Dia/Mês/Ano, ou seja, o cliente digita Dia/Mês/Ano, o programa  muda para Mês/Dia/Ano, faz todo o trabalho de recuperação dos dados e  depois muda de novo para Dia/Mês/Ano. 
Alguns devem pensar, pô.....engraçado, o cara do artigo fala que o  formato da data é alterada pelo Interbase mas quando eu abro o IBConsole  e dou um select * from Nome_da_Tabela, a data [campo do tipo Tdate] vem  no formato dd/mm/aaaa, e não como ele diz que é...... Simples, é que ao  fazer esse select no IBConsole, o Interbase verifica as configurações  regionais do Windows e já retorna no formato correto, só que se você  colocar um dbgrid no seu aplicativo para testar e der o mesmo select,  irá ver que a data virá invertida, da forma que eu estou dizendo.