Jump to content

Resultado de query inesperado


diogom
 Share

Recommended Posts

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Tenho duas perguntas:

1 - Porque usas varchar para guardar datas?

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

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

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é!

Link to comment
Share on other sites

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.

Link to comment
Share on other 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
Link to comment
Share on other sites

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)

Edited by nelsonr
Link to comment
Share on other sites

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)
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.