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

diogom

Resultado de query inesperado

Mensagens Recomendadas

diogom    0
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


Link para a mensagem
Partilhar noutros sites
Rechousa    63
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


Link para a mensagem
Partilhar noutros sites
jsWizard    6
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


Link para a mensagem
Partilhar noutros sites
diogom    0
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


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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


Link para a mensagem
Partilhar noutros sites
nelsonr    333
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


Link para a mensagem
Partilhar noutros sites
diogom    0
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


Link para a mensagem
Partilhar noutros sites
Rechousa    63
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


Link para a mensagem
Partilhar noutros sites
diogom    0
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


Link 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.