MySQL, Usando Expressões Regulares (+Dicas)
Publicado; novembro 20, 2007 Filed under: Expressões Regulares, MySQL | Tags: Expressões Regulares, MySQL, REGEX, REGEXP, RLIKE Leave a comment »
Antes de mais nada, quem é esse tal de REGEX ?
Não passa de uma abreviação (do ingês) de Expressões Regulares, e …
E de forma breve, “Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto”, exemplo básico:
- A coleção ou o conjunto de strings que possuem a letra inicial X ?
Bem didático, mais e as regras, as malditas regras, são muitas ? nahh, é tudo bem básico e as mais utilizadas você pode conferir aqui:
Leia o resto deste post »
PHP, Manipulando Datas (+Horas)
Publicado; novembro 8, 2007 Filed under: MySQL, PHP | Tags: Data, Date, Extenso, MySQL, PHP, Semana, strftime, strtotime, Y-m-d 14 Comments »Update, Twitter: @jonathanisaac
Resolvi me adiantar e escrever um pouco sobre a manipulação de datas e tempo (hora) no php, coisas do cotidiano de um desenvolvedor.
1 – Data e Hora Atual
Pelo básico temos date(“d/m/Y”) resultando em ex: 01/01/2007, sendo d,m,Y representando dia, mês e ano na tabela de caracteres do parâmetro de formatação da função date.
d, exibe o dia sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
m, exibe o mês sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
Y, exibe o ano por extenso, 4 digitos, ex: 2007, utilizando y minúsculo teremos resultado 07
Na mesma lógica temos date(“h:i:s”) exibindo a hora atual do sistema, resulando em ex: 01:01:50, temos então ,h,i,s representando hora, minutos e segundos respectivamente, tendo:
h, exibe o hora sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
i, exibe os minutos sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
s, exibe os segundos sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
É possível brincar de infinitas formas com o posicionamento dos parâmetros e situações que a data será exibida, ex: date(“d/m/Y h:i:s”) que irá exibir data e hora no formato convencional ou date(“Y-m-d h:i:s”) que retorna o padrão do MySQLcampo DateTime.
2 – Dia da Semana (Extenso) a partir da Data
Costumo utilizar a seguinte função (retornar dia da semana por extenso):
/*
Função que retorna o dia da semana
Formato da data deverá ser Y-m-d
*/
function Semana($data) {
$rs = strftime('%w',strtotime($data));
switch($rs) {
case "0": $s = "Domingo"; break;
case "1": $s = "Segunda-feira"; break;
case "2": $s = "Terça-feira"; break;
case "3": $s = "Quarta-feira"; break;
case "4": $s = "Quinta-feira"; break;
case "5": $s = "Sexta-feira"; break;
case "6": $s = "Sábado"; break;
}
return $s;
}
Função muito simples que usa os recursos do strtotime (string to time) e do strftime (string format time), para usar basta passar a data pro formato que eu utilizei ou adaptar a função para fazé-lo automaticamente, não fiz isso pois utilizo funções de conversão, mostradas mais abaixo, mais ai vai o exemplo:
echo Semana(2007-11-08); // Retorna Quinta-Feira
3 – Formata data, para MySQL (Date) e Formulários
Aqui serão exibidas duas funções, uma que converte a data no formato DateTime do MySQL para nosso padrão 01/01/2007 e outra que passa o padrão DateTime do MySQL para nosso padrão convencional.
3.1 – Formato Date do MySQL para Padrão Convencional
/*
Função que converte Y-m-d para d/m/Y
Utilizado para manipular datas no formato Date do MySQL
exibindo no formato convencional.
*/
function dtPadrao($data) {
$data = trim($data);
if (strlen($data) < 10)
{
$rs = "";
}
else
{
$arr_data = explode(" ",$data);
$data_db = $arr_data[0];
$arr_data = explode("-",$data_db);
$data_form = $arr_data[2]."/".$arr_data[1]."/".$arr_data[0];
$rs = $data_form;
}
return $rs;
}
Usando:
echo dtPadrao("2007-11-08"); // Retornará 08/11/2007
3.2 – Padrão Convencional para formato Date do MySQL
/*
Função que converte d/m/Y para Y-m-d
Utilizado para inserir datas do tipo converncional em
campos tipo Date do MySQL
*/
function dtBanco($data) {
$data = trim($data);
if (strlen($data) != 10)
{
$rs = "";
}
else
{
$arr_data = explode("/",$data);
$data_banco = $arr_data[2]."-".$arr_data[1]."-".$arr_data[0];
$rs = $data_banco;
}
return $rs;
}
Usando:
echo dtBanco("08/11/2007"); // Resultará 2007-11-08
Espero ter ajudado, pois explicar linha a linha dessas funções é pedir demais.
4 – Operações Básicas com Datas (Somar e Subtrair Dias)
Existe N formas de se fazer isso, com N formas de desenvolver uma função para isso, então o que eu vou passar é a que eu justamente uso no meu dia a dia.
4.1 – Operações em cima da Data Atual
echo strftime("%d/%m/%Y", strtotime("+1 days")); // Hoje mais 1 dia
echo strftime("%d/%m/%Y", strtotime("-2 days")); // Hoje menos 2 dias
echo strftime("%d/%m/%Y %H:%M:%S", strtotime("+1 month 1 days 1 hours 1 minutes"));
// Hoje + 1 mes, 1 dia, 1 hora e 1 minuto.
Simples.
4.2 – Operações em cima de qualquer Data.
Para somar dias a uma data temos (no exemplo foi passado +1 dia):
/*
Função para somar datas em dias
Data no formato Y-m-d
*/
function dtSomar($data,$dias) {
$data = str_replace("-","",$data);
$ano = substr ( $data, 0, 4 );
$mes = substr ( $data, 4, 2 );
$dia = substr ( $data, 6, 2 );
$novaData = mktime ( 0, 0, 0, $mes, $dia + $dias, $ano );
return strftime("%Y-%m-%d", $novaData);
}
Usando (formato da data será Y-m-d):
echo dtSomar("2007-01-10",1); // Resultará 2007-01-11
Para subtrair dias a uma data temos (no exemplo foi passado -1 dia):
/*
Função para subtrair datas em dias
Data no formato Y-m-d
*/
function dtSubtrair($data,$dias) {
$data = str_replace("-","",$data);
$ano = substr ( $data, 0, 4 );
$mes = substr ( $data, 4, 2 );
$dia = substr ( $data, 6, 2 );
$novaData = mktime ( 0, 0, 0, $mes, $dia - $dias, $ano );
return strftime("%Y-%m-%d", $novaData);
}
Usando (formato da data será Y-m-d):
echo dtSubtrair("2007-01-10",1); // Resultará 2007-01-11
5 – Quantidade de Dias de um Determinado Mês
Uma vez perguntaram isso em um desses foruns e percebi que poderia ser mais fácil que eu imaginava, fui caça no mktime descobri isso:
echo date("t", mktime(0, 0, 0, 1, 1, 2007));
// Retornará a quantida de dias do mês de janeiro do ano de 2007
0, 0, 0, 1, 1, 2007, Representa 1-1-2007 ou seja, vai pegar a quantidade de dias presentes no mês de janeiro mais verificando o ano para ver se é bissexto
Detalhe é necessário preencher o dia.
5 – Finalizando
A cada função utilizada eu tentei ao máximo inserir um link para a referência oficial do php.net em português, espero que tenham reparado.
Caso não compreenda alguma função utilize:
http://br2.php.net/NOME_DA_FUNÇÃO
Gostaria também de dizer que as funções aqui apresentadas eu utilizo a anos, muitos anos, algumas (a maioria) eu mesmo elaborei, talvez uma eu não me recordo seja de fonte de autoria desconhecida.
Lembrando também que pode ser que chegue um doido aqui e fale que uma função dessas da para simplificar a uma linha, eu iria ficar feliz.
MySQL, Manipulando Datas (+ Horas)
Publicado; novembro 7, 2007 Filed under: MySQL | Tags: Data, Data e Hora, Date, DateTime, MySQL 4 Comments »
Acompanho sempre a utilização do MySQL pelos articulistas, blogueiros, foruns entre outros, e sempre vejo perguntas relacionadas a datas (e horas), pensando nisso resolvi juntar algumas dicas básicas no tratamento de datas no mysql.
1. Campo Date e DateTime
Por definição o campo Date do MySQL é formado por: DIA-MÊS-ANO no formato 01-01-1984, se você não gosta desse formato se adeque a ele caso contrário irá render muitos problemas.
Seguindo a mesma lógica o DateTime é formado por: DIA-MÊS-ANO HORA:MINUTO:SEGUNDO, ou seja, é um campo Date com acréscimo do horário, ficaria com o formato 01-01-1984 01:01:01, utilizo muito quando algum campo meu tem repetidas inserções ao longo do dia, é uma forma de diferenciá-las, como no log de acesso.
2. Pesquisar por determinado dia, mês ou ano
O interessante é que poucas pessoas utilizam isso mais é bem simples, presume-se que você utiliza o campo Date ou DateTime.
select * from tabela where DAY(CampoData) = 2
A query acima indica que estamos procurando e exibindo todos registros em tabela onde oo dia for igual a 2 (dois) sendo que o dia será retirado do CampoData que é do tipo Date ou DateTime através da função DAY.
No caso do campo do tipo DateTime é possível também resgatar através das funções HOUR, MINUTE, SECOND os pedaços que representam a hora, minuto e segundo respectivamente.
A função DAY tem suas semelhantes para mês e ano que são MONTH() e YEAR()
3. Utilizei o campo do tipo VarChar para Data e agora ?
Mais qual o problema ? Simples, quando você precisar fazer uma consulta que a cláusula where seja o campo de data em varchar, voce terá problemas pois a comparação em tipo texto é feita da esquerda para a direita ou seja, 01/10/1984 será maior que 01/01/2008 pois 10 > 01, percebe-se que existe um campo Date então use ele, mais se voce já fez a burrada e atualizar o banco a essas horas seria custoso demais, seus problemas acabaram, o MySQL possui uma função nativa chamada STR_TO_DATE que é justamente para solucionar situações parecidas, vamos lá:
select * from tabela
where STR_TO_DATE(campoDataTexto, '%d/%m/%Y') > '1984-10-01'
O STR_TO_DATE ele converte o seu campo data no tipo varchar para o formato padrão do MySQL, repare que como argumento você deverá passar o formato que voce utilizou na sua data, no nosso caso temos %d/%m/%Y ou 01/01/2007, %d representa o dia com tamanho 2, %m representa o mês com tamanho 2, e %Y representa o ano por extenso com tamanho 4.
4. Data e Hora Atual
Existe duas funções do nível que eu utilizo muito, NOW (ou CURRENT_TIMESTAMP) e CURRENT_DATE (ou CURDATE)
NOW() : Retorna Data e Hora no formato DateTime de acordo com o time zone do MySQL.
CURRENT_DATE() : Retorna a Data no formato Date também de acordo com o time zone do MySQL.
Utilizando ambos:
insert into tabela (`data`,`dataHora`) values (CURRENT_DATE(),NOW())
Seguindo a lógica meu campo data é do tipo Date e meu campo DataHora é do tipo DateTime.
5. PHP
Na parte de PHP entram várias funções de entrada e saida de datas e hora, assunto vasto e cheio de funções fica para a próxima.
6. Referência
Todas as funções de Data e Hora.