MYSQL NAO FAZ BETWEEN DIREITO COM DATAS

FBUR 30/11/2009 14:39:33
#328857
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:


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
MARCOSLING 30/11/2009 16:21:36
#328863
Mas será que não é por causa das horas, minutos e segundos?
FBUR 30/11/2009 16:31:17
#328866
Não. O problema ocorre mesmo considerando apenas o dia, mês e ano.
RCMRO 30/11/2009 16:48:24
#328867
Resposta escolhida
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[ô][Ô]
MARCOSLING 30/11/2009 17:04:42
#328869
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.
FBUR 30/11/2009 17:29:37
#328871
é 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:


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