MYSQL NAO FAZ BETWEEN DIREITO COM DATAS
Boa tarde.
Ha um tempo atrás, andei tendo umas dúvidas sobre como utilizar expressões SQL com datas no MySQL.
Eis um exemplo que me retorna os cadastros feitos em um determinado perÃodo:
Só a tÃtulo informativo, também pode ser feito com AND e sinais de [Ô]<=[Ô] e [Ô]>=[Ô], assim:
OBS1: Uma vez me disseram aqui no VBM que o BETWEEN não funciona no MySQL, mas funciona sim...
Dos dois jeitos dá certo, contanto que existam apóstrofos no inÃicio e final das datas.
OBS2: Tem que ter os apóstrofo, senão dá erro quado a expressão for executada.
Ou seja:
Continuando o exemplo...
Considerando que:
- data inicial = 01/11/2009
- data final = 30/11/2009
- existem cadastros em todas os dias do mês.
Quando solicito que um o sistema me retorne cadastros de 10/11/2009 à 20/11/2009, sempre um dia da data final fica de fora. Ou seja, a pesquisa me retorna registros com data entre 10/11/2009 e 19/11/2009, e deveria ser até 20/11/2009.
Porém isso só acontece com a data final, nunca com a data inicial.
Isso acontece tanto com o BETWEEN quanto com o AND e os operadores [Ô]>=[Ô] e [Ô]<=[Ô].
Para contornar o problema, somo um dia na data final, aà dá certo. Dessa forma:
Usando BETWEEN:
ou usando os operadores:
Aà sim. Quando solicito que me retorne os cadastros entre 10/11/2009 e 20/11/2009, o dia 20 tambem é retornado na consulta (pois o problema só acontece com a data final).
A pergunta é: Isso é algum bug no MySQL??
Utilizo a versão MySQL 5.0.51
[ ]'s
Ha um tempo atrás, andei tendo umas dúvidas sobre como utilizar expressões SQL com datas no MySQL.
Eis um exemplo que me retorna os cadastros feitos em um determinado perÃodo:
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro BETWEEN [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô] [Ô] & _
[Ô]AND [ô][Ô] & Format(dtFinal.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô][Ô]
Só a tÃtulo informativo, também pode ser feito com AND e sinais de [Ô]<=[Ô] e [Ô]>=[Ô], assim:
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro >= [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô] [Ô] & _
[Ô]AND DataCadastro <= [ô][Ô] & Format(dtFinal.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô][Ô]
OBS1: Uma vez me disseram aqui no VBM que o BETWEEN não funciona no MySQL, mas funciona sim...
Dos dois jeitos dá certo, contanto que existam apóstrofos no inÃicio e final das datas.
OBS2: Tem que ter os apóstrofo, senão dá erro quado a expressão for executada.
Ou seja:
yyyy-mm-dd hh:mm:ss - assim dá erro.
[ô]yyyy-mm-dd hh:mm:ss[ô] - assim não dá erro.
Continuando o exemplo...
Considerando que:
- data inicial = 01/11/2009
- data final = 30/11/2009
- existem cadastros em todas os dias do mês.
Quando solicito que um o sistema me retorne cadastros de 10/11/2009 à 20/11/2009, sempre um dia da data final fica de fora. Ou seja, a pesquisa me retorna registros com data entre 10/11/2009 e 19/11/2009, e deveria ser até 20/11/2009.
Porém isso só acontece com a data final, nunca com a data inicial.
Isso acontece tanto com o BETWEEN quanto com o AND e os operadores [Ô]>=[Ô] e [Ô]<=[Ô].
Para contornar o problema, somo um dia na data final, aà dá certo. Dessa forma:
Usando BETWEEN:
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro BETWEEN [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô] [Ô] & _
[Ô]AND [ô][Ô] & Format(dtFinal.Value + 1, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô][Ô]
ou usando os operadores:
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro >= [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô] [Ô] & _
[Ô]AND DataCadastro < [ô][Ô] & Format(dtFinal.Value + 1, [Ô]yyyy-mm-dd hh:mm:ss[Ô]) & [Ô][ô][Ô]
Aà sim. Quando solicito que me retorne os cadastros entre 10/11/2009 e 20/11/2009, o dia 20 tambem é retornado na consulta (pois o problema só acontece com a data final).
A pergunta é: Isso é algum bug no MySQL??
Utilizo a versão MySQL 5.0.51
[ ]'s
Mas será que não é por causa das horas, minutos e segundos?
Não. O problema ocorre mesmo considerando apenas o dia, mês e ano.
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro >= [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd[Ô]) & [Ô] 00:00:00[ô] [Ô] & _
[Ô]AND DataCadastro < [ô][Ô] & Format(dtFinal.Value + 1, [Ô]yyyy-mm-dd[Ô]) & [Ô] 23:59:59[ô][Ô]
Citação:FBUR escreveu:
Não. O problema ocorre mesmo considerando apenas o dia, mês e ano.
Eu tive um problema semelhante quando o campo havia sido gravado com data e hora.
é verdade MARCOSLING. Vc tem razão.
Depois que o RCMRO postou o código, que só faltou retirar o + 1 da data final, ficou assim:
Agora faz sendido (e é lógico). Pois eu formatava a data final para 20/11/2009 00:00:00 e qualquer horário diferente deste não iria entrar nunca na pesquisa. A menos que algum cadastro fosse criado à meia-noite do dia 20/11/2009
Na data final, formatando apenas a parte da data e concatenando com 23:59:59, aà sim.
Então na verdade o problema não era gravar a data com a hora, mas sim como formatamos a string SQL para retornar os dados.
Obrigado!
[ ]'s
Depois que o RCMRO postou o código, que só faltou retirar o + 1 da data final, ficou assim:
strSQL = [Ô]SELECT Nome [Ô] & _
[Ô]FROM tblcadastros [Ô] & _
[Ô]WHERE DataCadastro >= [ô][Ô] & Format(dtInicial.Value, [Ô]yyyy-mm-dd[Ô]) & [Ô] 00:00:00[ô] [Ô] & _
[Ô]AND DataCadastro < [ô][Ô] & Format(dtFinal.Value, [Ô]yyyy-mm-dd[Ô]) & [Ô] 23:59:59[ô][Ô]
Agora faz sendido (e é lógico). Pois eu formatava a data final para 20/11/2009 00:00:00 e qualquer horário diferente deste não iria entrar nunca na pesquisa. A menos que algum cadastro fosse criado à meia-noite do dia 20/11/2009
Na data final, formatando apenas a parte da data e concatenando com 23:59:59, aà sim.
Então na verdade o problema não era gravar a data com a hora, mas sim como formatamos a string SQL para retornar os dados.
Obrigado!
[ ]'s
Tópico encerrado , respostas não são mais permitidas