cmd Posted March 30, 2012 Report Share Posted March 30, 2012 Boas a todos, Estou a tentar recolher os dados de uma BD SQL entre as datas (exemplo) 01-01-2012 e 02-01-2012 e estou a utilizar o BETWEEN. O problema é que ele retorna-me todas as datas entre 01 e 02 e ignora-me os restantes numeros. Como posso resolver? O campo data está como texto e não posso alterar a estrutura :s Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 30, 2012 Report Share Posted March 30, 2012 Se o campo é texto, não podes esperar milagres. Tens de fazer casts para data, mas é uma solução à lavrador... Para além disso, SQL usam todas, à partida. Especifica por favor. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 30, 2012 Author Report Share Posted March 30, 2012 E como deveria usar os casts? Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 30, 2012 Report Share Posted March 30, 2012 Qual é o SGBD ? Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 30, 2012 Author Report Share Posted March 30, 2012 MS Access Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 30, 2012 Report Share Posted March 30, 2012 Ui. Experimenta com o CDate. Algo como: SELECT bla bla bla FROM tabela WHERE CDate(a_tal_data) BETWEEN CDate(a_data_inicio) AND CDate(a_data_fim) Partindo do início que a data em texto está num formato que o CDate agarre. Isso já não te sei dizer porque não uso MSAccess assim tanto (leia-se nada) Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 30, 2012 Author Report Share Posted March 30, 2012 EDIT: Continua sem funcionar :s http://img685.imageshack.us/img685/9559/capturadeecr20120330s21.png Sugestões? Cumps.cmd Link to comment Share on other sites More sharing options...
pmg Posted March 30, 2012 Report Share Posted March 30, 2012 Calcula ano*13*32 + mes*32 + dia para os tres valores relevantes. Depois faz o BETWEEN com base nesses calculos select ... where ... CALCULO1 between CALCULO2 and CALCULO3 ... Melhor ainda era alterar a base de dados ... ah ... espera ... pois 😉 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
cmd Posted March 30, 2012 Author Report Share Posted March 30, 2012 Calcula ano*13*32 + mes*32 + dia para os tres valores relevantes. Depois faz o BETWEEN com base nesses calculos select ... where ... CALCULO1 between CALCULO2 and CALCULO3 ... Melhor ainda era alterar a base de dados ... ah ... espera ... pois 😉 Não estou a perceber esses cálculos. Podias-me explicar melhor sff? Cumps.cmd Link to comment Share on other sites More sharing options...
pmg Posted March 30, 2012 Report Share Posted March 30, 2012 Os calculos vao originar numeros sequenciais (com buracos) de acordo com as datas. Por exemplo para 29 de Fevereiro de 2012 2012*32*13 + 2*32 + 29 = 837085 1 de Marco de 2012 2012*32*13 + 3*32 + 1 = 837089 Como ves, 29 de fevereiro foi antes de 1 marco, e o calculo correspondente foi inferior ao de 1 de Marco 😉 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
cmd Posted March 30, 2012 Author Report Share Posted March 30, 2012 Os calculos vao originar numeros sequenciais (com buracos) de acordo com as datas. Por exemplo para 29 de Fevereiro de 2012 2012*32*13 + 2*32 + 29 = 837085 1 de Marco de 2012 2012*32*13 + 3*32 + 1 = 837089 Já percebi! Mas o formato da data na BD está, por exemplo, assim: 02-03-2012. Como vou conseguir fazer o between como os valores provenientes dos cálculos? Cumps.cmd Link to comment Share on other sites More sharing options...
pmg Posted March 30, 2012 Report Share Posted March 30, 2012 Mas o formato da data na BD está, por exemplo, assim: 02-03-2012. Isolar partes dum texto, transformar essas partes em numeros ja nao sei fazer (em Access) ... mas nao me parece muito dificil. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 30, 2012 Report Share Posted March 30, 2012 Bem lembrado! Outra forma de fazer isso é simplesmente juntar os três elementos. Isto produz igualmente números que se podem comparar normalmente. 2012-02-29 = 20120229 2012-03-01 = 20120301 20120229 < 20120301 Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 31, 2012 Author Report Share Posted March 31, 2012 Compreendo. Mas como transformo a data que vem da BD em números "corridos"? É que estou a buscar os dados e mostrar numa datagridview de uma aplicação em vb.net. Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 31, 2012 Report Share Posted March 31, 2012 SELECT bla bla bla FROM tabela WHERE REPLACE(a_tal_data,'-','') BETWEEN REPLACE(data_inicio,'-','') AND REPLACE(data_fim,'-','') Que talvez não funcione a menos que transformes os resultados dos replace em numero, com VAL() ou coisa parecida. VAL(REPLACE(data_inicio,'-','')) talvez... experimenta. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 31, 2012 Author Report Share Posted March 31, 2012 Dá-me este erro: A função "REPLACE" não está definida na expressão. Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 31, 2012 Report Share Posted March 31, 2012 Mostra lá a query toda. Experimenta antes mesmo no Access antes de tentares na aplicação. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 31, 2012 Author Report Share Posted March 31, 2012 sqlselect = "SELECT movimentacaoapara.ID, movimentacaoapara.data, movimentacaoapara.codfornecedor, movimentacaoapara.transportenr, movimentacaoapara.faturanr, movimentacaoapara.tipo, movimentacaoapara.pesoinicial, movimentacaoapara.pesolaboratorioI, movimentacaoapara.pesolaboratorioF, movimentacaoapara.humidade, movimentacaoapara.desconto, movimentacaoapara.pesofaturado, movimentacaoapara.preco, movimentacaoapara.valorfatura FROM movimentacaoapara WHERE codfornecedor='" & cbb_forns.Text & "' AND REPLACE(data,'-','') BETWEEN '" & datain & "' AND '" & datafim & "' ORDER BY ID DESC" Cumps.cmd Link to comment Share on other sites More sharing options...
ribeiro55 Posted March 31, 2012 Report Share Posted March 31, 2012 Deveria ser: " AND VAL(REPLACE(data,'-','')) BETWEEN " & datain & " AND " & datafim & " ORDER BY ID DESC" Pressupondo que datain e datafim já se encontram no formato AAAAMMDD, sem hifens. Mas de acordo com o erro anterior, o problema parece-me outro. Alguém com mais experiência Access te dirá porque é que o replace não está a funcionar. Podes deixar, entretanto, qual é a versão do Access. Outra coisa, se só tens uma tabela no FROM, não precisas de a especificar em todas as colunas do Select... Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
cmd Posted March 31, 2012 Author Report Share Posted March 31, 2012 Deveria ser: " AND VAL(REPLACE(data,'-','')) BETWEEN " & datain & " AND " & datafim & " ORDER BY ID DESC" Pressupondo que datain e datafim já se encontram no formato AAAAMMDD, sem hifens. Mas de acordo com o erro anterior, o problema parece-me outro. Alguém com mais experiência Access te dirá porque é que o replace não está a funcionar. Podes deixar, entretanto, qual é a versão do Access. Outra coisa, se só tens uma tabela no FROM, não precisas de a especificar em todas as colunas do Select... Continua-me a dar o mesmo erro. O access é o 2010. Cumps.cmd Link to comment Share on other sites More sharing options...
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