Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

diogom

Resultado de query inesperado

Mensagens Recomendadas

diogom

Olá,

Tenho uma tabela onde tenho um campo data(varchar) com varias datas. Quando faço para executar esta query Select user, data from fichacli Where user = 'dm' and data between '24/04' and '27/a4', retorna datas que n quero.

tabela fichacli

campo data

24/04/2013

25/04/2013

27/03/2013

30/03/2013

resultado:

campos user data

x 24/04/2013

x 25/04/2013

x 27/03/2013

Não percebo o que estara errado. Se alguem souber, agradecia.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Olá,

Não sou especialista em MySQL mas reparei em várias coisas:

- Devias usar um tipo de dados próprio para guardar a data (é muito mais eficiente no tratamento de datas, diz-te se a data é válida ou não, e foi para isso que ele foi criado);

- Talvez tenhas digitado mal, mas no segundo parâmetro do BETWEEN tens lá um caractér 'a' que me parece que está a mais (27/a4)

- Não estás a colocar o ano;

- Pelo facto de teres o campo em varchar, o motor de SGBD compara como texto;


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jsWizard

Tenho duas perguntas:

1 - Porque usas varchar para guardar datas?

2 - Porque esperas que o BETWEEN funcione com um campo varchar? :D

estás à espera que a base de dados adivinhe que tens lá datas? :D

hehehe!

A minha sugestão.. se são datas, usa uma coluna do tipo DATE ;) muito simples :)

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-type-overview.html

Inté!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diogom

O 'a' enganei-me ao passar para aqui. Eu não usei o tipo de data "date", porque não põe no formato que quero. d/m/a. Com o ano ou sem o ano, o resultado é o mesmo.

O que quero é procurar só pelo dia e mes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se queres que a base de dados faça esse tipo de operações, então terás de usar DATE ou TIME ou DATETIME ou TIMESTAMP

se não aparece no formato que pretendes, é problema da tua aplicação e não da base de dados. isto quer dizer que é da tua responsabilidade de alterar o formato de apresentação dos dados


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Como o Rechousa já disse, as datas não têm nenhum formato especifico quando estão na base de dados (com o campo do tipo data).

Ao serem mostradas é que a aplicação transforma e mostra de acordo com a cultura ou outra configuração que possa existir.

Por isso, sempre que possível usa um dos vários tipo de data.

No entanto, uma forma de dares a volta ao usares datas no formato texto, é guardar usando o ano, mês e dia (ex: 2013/04/24, 2013/05/01).

Isso assim facilita a ordenação e o filtro (mas tens de incluir o ano)

Editado por nelsonr

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diogom

Como o Rechousa já disse, as datas não têm nenhum formato especifico quando estão na base de dados (com o campo do tipo data).

Ao serem mostradas é que a aplicação transforma e mostra de acordo com a cultura ou outra configuração que possa existir.

Por isso, sempre que possível usa um dos vários tipo de data.

No entanto, uma forma de dares a volta ao usares datas no formato texto, é guardar usando o ano, mês e dia (ex: 2013/04/24, 2013/05/01).

Isso assim facilita a ordenação e o filtro (mas tens de incluir o ano)

Foi o que fiz. Obrg.

Existe maneira de fazer um select só a pesquisar o dia e mes, sem o ano.

ja tentei isto mas não dá.

SELECT datanasc from fichacli where user = '" + userTB.Text + "'and datanasc = '%" + datasistema + "'"; datasistema=(04/30)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Experimenta assim (não testei):

SELECT datanasc from fichacli where user = '" + userTB.Text + "' AND DAY(datanasc) = DAY(SYSDATE()) AND MONTH(datanasc) = MONTH(SYSDATE())"

O teu código é vulnerável a SQL Injection. Aconselho vivamente a que não faças concactenação de strings na construção de Query's SQL, usa parâmetros.

Exemplo:

http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diogom

Experimenta assim (não testei):

SELECT datanasc from fichacli where user = '" + userTB.Text + "' AND DAY(datanasc) = DAY(SYSDATE()) AND MONTH(datanasc) = MONTH(SYSDATE())"

O teu código é vulnerável a SQL Injection. Aconselho vivamente a que não faças concactenação de strings na construção de Query's SQL, usa parâmetros.

Exemplo:

http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php

Não deu.

Faço o leituta.execurnonquery e na leitura esta isto MySql.Data.MySqlClient.MySqlDataReader

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.