MySQL, Usando Expressões Regulares (+Dicas)

MySQL

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)

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)

MySQL

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.


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.