diogom Posted April 30, 2013 at 08:49 AM Report #505282 Posted April 30, 2013 at 08:49 AM 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.
Rechousa Posted April 30, 2013 at 09:03 AM Report #505285 Posted April 30, 2013 at 09:03 AM 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
jsWizard Posted April 30, 2013 at 09:04 AM Report #505286 Posted April 30, 2013 at 09:04 AM 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é!
diogom Posted April 30, 2013 at 09:08 AM Author Report #505287 Posted April 30, 2013 at 09:08 AM 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.
HappyHippyHippo Posted April 30, 2013 at 09:23 AM Report #505288 Posted April 30, 2013 at 09:23 AM 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 Portugol Plus
Rechousa Posted April 30, 2013 at 09:46 AM Report #505292 Posted April 30, 2013 at 09:46 AM @diogom: HappyHippyHippo tem razão, uma coisa é como os dados são guardados, outra é como são apresentados. Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
nelsonr Posted April 30, 2013 at 10:06 AM Report #505293 Posted April 30, 2013 at 10:06 AM (edited) 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 April 30, 2013 at 10:08 AM by nelsonr
diogom Posted April 30, 2013 at 01:01 PM Author Report #505307 Posted April 30, 2013 at 01:01 PM 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)
Rechousa Posted April 30, 2013 at 01:06 PM Report #505308 Posted April 30, 2013 at 01:06 PM 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
diogom Posted April 30, 2013 at 02:45 PM Author Report #505321 Posted April 30, 2013 at 02:45 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now