quinta-feira, 28 de agosto de 2008

Enganando o SGBD

É extremamente comum em linguagens de programação, quando gera-se um código SQL, que campos do tipo “date/time” dos SGBD´s(Sistemas Gerenciadores de Banco de Dados. Exemplo: Oracle) sejam gravados e exibidos no formato americano.

Resultado de um SQL com campo tipo “date/time” no formato americano:
8-23-2008 00:00:00

O grande detalhe é que em campos de formulário, a solicitação de pesquisa de datas é feita no formato padrão dd/mm/yyyy.
Como estavam ocorrendo erros de pesquisa, modifiquei o código PHP das aplicações para fazer pesquisa que utilizam datas como filtro.
A primeira etapa segue igual, com duas variáveis recebendo os dados do formulário, via GET ou POST. Veja abaixo:

// Variáveis recebendo dados do formulário
$data1=$_POST['datainicial'];
$data2=$_POST['datafinal'];

Aqui é que ocorre a grande mudança, com as variáveis que recebem os dados formulário, sendo convertidas para o formato americano com a função “explode”.
Veja abaixo:

// Código que converte os valores (Função “explode”)
$dt1 = $data1;
$dt_exp1 = explode(" ", $dt1);
$dt_arr1 = explode("/", $dt_exp1[0]);
$dt_formatada1 = $dt_arr1[2]."-".$dt_arr1[1]."-".$dt_arr1[0]." "."00:00:00";

$dt2 = $data2;
$dt_exp2 = explode(" ", $dt2);
$dt_arr2 = explode("/", $dt_exp2[0]);
$dt_formatada2 = $dt_arr2[2]."-".$dt_arr2[1]."-".$dt_arr2[0]." "."00:00:00";

Nesta etapa, o código SQL é muito variado, por isso resolvi mostrar que serão as variáveis resultantes da função explode o parâmetro de pesquisa.
PS: Antes eram utilizadas no SQL as variáveis $data1 e $data2, por isso estavam ocorrendo os erros de pesquisa descritos anteriormente.

>= #$dt_formatada1#
<= #$dt_formatada2#


Já utilizava anteriormente a função explode e apenas para encerrar o post, segue o código para exibir a data no formato dd/mm/yyyy.

// Código para formatar a data
$dt = odbc_result($sql,"DATA");
$dt_exp = explode(" ", $dt);
$dt_arr = explode("-", $dt_exp[0]);
$dt_formatada = $dt_arr[2]."/".$dt_arr[1]."/".$dt_arr[0];


Todo dia é um dia especial.

0 comentários: