Alguma vez você executou um comando SQL como o apresentado abaixo e não obteve linha alguma como resultado?
SELECT * FROM teste WHERE datahora <= '2007-06-03';
Isso já aconteceu diversas vezes comigo e sempre chego à mesmoaconclusão: o campo da cláusula WHERE (datahora) é do tipo DateTime, ou seja, armazena além da data o horário, e isso gera um problema no SQL acima.
Farei os testes usando a seguinte tabela:
CREATE TABLE teste
(
datahora DATETIME NOT NULL
)
E os seguintes registros:
INSERT INTO teste VALUES ('2007-06-03 12:00:00');
INSERT INTO teste VALUES ('2007-06-03 13:30:00');
INSERT INTO teste VALUES ('2007-06-03 14:20:00');
INSERT INTO teste VALUES ('2007-06-03 15:10:00');
Bem simples, mas é o suficiente para demonstrar um grande problema que pode acontecer ao executar o comando SELECT apresentado no início do post.
Repare que todos os registros possuem além da data um horário. Portanto, se você tentar buscar todos os registros onde o campo datahora for menor ou igual a ‘2007-06-03′, a lista de registros encontrados estará vazia. Por que, hãm? Pois ‘2007-06-03 12:00:00′, ou ‘2007-06-03 13:30:00′ (dois exemplos aleatórios da tabela criada anteriormente) não são menores ou iguais a ‘2006-06-03′.
Em outras palavras, o MySQL está considerando o tempo ao comprar os valores, e como o valor da cláusula WHERE não especifica um horário, ele assume o padrão (00:00:00). Logo, ‘2007-06-03 13:30:00′ não é menor que ‘2007-06-03 00:00:00′, por isso não é incluído no resultado.
Para resolver isso de uma forma bem rápida, simples e not(IsWordAround), basta usar a função DATE_FORMAT do próprio MySQL.
O SELECT apresentado anteriormente fica assim:
SELECT * FROM teste
WHERE DATE_FORMAT(datahora, '%Y-%m-%d') <= '2007-06-03';
Ou seja, agora o MySQL utiliza somente a data para realizar as comparações entre os valores. O resultado apresentado é este:
Para ficar mais claro como o banco está processando a query, execute o seguinte comando:
SELECT DATE_FORMAT(datahora, '%Y-%m-%d') FROM teste;
O resultado é:
Simples, fácil, rápido e legível. Nada de ficar inventando tratamentos extras, mudando os operadores das queries, etc. Basta fazer uso das funções do próprio banco.
Para obter mais informações sobre esta função, veja o artigo do Fábio que foi publicado no site Viva o Linux ou a documentação oficial do MySQL.
É isso ae. Até +.