Duvida com essa SQL - Ajuda
Essa é a SQL
o resultado dela era pra ser
Correto? Porém está trazendo dados do ano de 2005, 2004... onde está o erro? tentei fazer por filtro (direto na table) mas trouxe a mesma coisa.
Tentei tbm dessa forma
e o resultado foi o mesmo... Alguem tem a solução? Por favor!!
Estou usando D7 + Firebird, esse campo data é do tipo STRING no formato Mes(2 digitos) /Ano (4 Digitos)
select * from CADRESUMOFAT where data between ´06/2006´ and ´08/2006´
o resultado dela era pra ser
06/2006
07/2006
08/2006
Correto? Porém está trazendo dados do ano de 2005, 2004... onde está o erro? tentei fazer por filtro (direto na table) mas trouxe a mesma coisa.
Tentei tbm dessa forma
select * from CADRESUMOFAT where data >= ´06/2006´ and data <= ´08/2006´
e o resultado foi o mesmo... Alguem tem a solução? Por favor!!
Estou usando D7 + Firebird, esse campo data é do tipo STRING no formato Mes(2 digitos) /Ano (4 Digitos)
Facc
Curtidas 0
Respostas
Campsoft
02/10/2006
Oi Fábio !
Eu não manjo muito de sql, mais pelo pouco que conheço, os operadores >= e <= funcionam a contento para campos numericos.
Não sei se existe a possibilidade de você desmembrar essa string em outros dois campos numericos [XX]/[YYYY] eu acho que lhe facilitaria muito a vida.
Um grande abraço !
Eu não manjo muito de sql, mais pelo pouco que conheço, os operadores >= e <= funcionam a contento para campos numericos.
Não sei se existe a possibilidade de você desmembrar essa string em outros dois campos numericos [XX]/[YYYY] eu acho que lhe facilitaria muito a vida.
Um grande abraço !
GOSTEI 0
Campsoft
02/10/2006
ahmmm.... lembrei... ja pensou em usar o like ?
select * from base where date like ´¬/2006´ and data like ´04/¬´
(meio tosco, mais na gambi funcionaria) hehe...
select * from base where date like ´¬/2006´ and data like ´04/¬´
(meio tosco, mais na gambi funcionaria) hehe...
GOSTEI 0
Facc
02/10/2006
ahmmm.... lembrei... ja pensou em usar o like ?
select * from base where date like ´¬/2006´ and data like ´04/¬´
(meio tosco, mais na gambi funcionaria) hehe...
Sim eu tentei usar o LIKE mas ele traz apenas os dois registros (06/2006 e 08/2006) e não essa ´faixa´ que eu preciso
GOSTEI 0
Macario
02/10/2006
Ola.
Usar campo char ou varchar para armazenar uma suposta data nao e uma boa opcao.
Em casos onde preciso como referencia apenas o mes e ano, eu utilizo um campo datetime normalmente, apenas na hora do cadastro eu sempre gravo a data como sendo 01/domes/doano. Assim na hora de efetuar pesquisas nao tenho problemas
Usar campo char ou varchar para armazenar uma suposta data nao e uma boa opcao.
Em casos onde preciso como referencia apenas o mes e ano, eu utilizo um campo datetime normalmente, apenas na hora do cadastro eu sempre gravo a data como sendo 01/domes/doano. Assim na hora de efetuar pesquisas nao tenho problemas
GOSTEI 0
Steve_narancic
02/10/2006
select * from CADRESUMOFAT where extract(month from data) between 06 and 08 and extract(year from data) = 2006
GOSTEI 0
Vinicius/campolina
02/10/2006
Tente usar conforme esse meu exemplo.
procedure Tfrmcracha.BitBtn6Click(Sender: TObject);
var
Inicio : string;
Final : string;
soma : extended;
begin
Soma := 0;
Inicio := edit7.Text ;
Final := edit8.text;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Text := ´SELECT naocobrar, totais, data FROM cracha WHERE (data between :pinicio and :pfinal) order by data ASC´;
adoquery1.Parameters.ParamByName(´pinicio´).Value := StrToDate(Inicio);
adoquery1.Parameters.ParamByName(´pfinal´).Value := StrToDate(final);
adoquery1.Open;
end;
end;
Dessa forma voce jogaria uma data inicial e uma final nos edits,
ele te retorna somente as datas que tiverem entre os edits.
Espero ter ajudado.
procedure Tfrmcracha.BitBtn6Click(Sender: TObject);
var
Inicio : string;
Final : string;
soma : extended;
begin
Soma := 0;
Inicio := edit7.Text ;
Final := edit8.text;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Text := ´SELECT naocobrar, totais, data FROM cracha WHERE (data between :pinicio and :pfinal) order by data ASC´;
adoquery1.Parameters.ParamByName(´pinicio´).Value := StrToDate(Inicio);
adoquery1.Parameters.ParamByName(´pfinal´).Value := StrToDate(final);
adoquery1.Open;
end;
end;
Dessa forma voce jogaria uma data inicial e uma final nos edits,
ele te retorna somente as datas que tiverem entre os edits.
Espero ter ajudado.
GOSTEI 0
Vinicius/campolina
02/10/2006
no código acima, egnore a variavel soma, eu usei para outro processo dentro desse código.
Voce não precisará dela.
Ok.
Voce não precisará dela.
Ok.
GOSTEI 0
Facc
02/10/2006
Acho que eu não consegui explicar direito minha dúvida. Esse campo DATA que eu falo, ele armazena apenas o mes/ano (String), e não uma data com dia/mes/ano (date), portanto não tem como eu fazer o que o [b:84df49cd3b]steve_narancic[/b:84df49cd3b] sugeriu em pegar apenas o mes e o ano...
GOSTEI 0
Steve_narancic
02/10/2006
voce pode adaptar meu primeiro select substituindo o extract por substring, e converter o valor para integer utilizando um cast
GOSTEI 0
Macario
02/10/2006
Ola.
Eu compreendi sua necessidade.
Trabalhar com datas em campos char/varchar e inoportunuo. Acarreta diversos problemas(tipo de separador de data, formato da data.;
Lhe disse que passei por situacao parecida e a solucao que encontrei foi converter o campo para datetime. Ai sempre que preciso inserir um MES/ANO, eu incluo como sendo o primeiro dia do MES/ANO por exemplo;
Desta forma posso trabalhar com pesquisas normalmente em cima do campo.
Creio que esta e a solucao mais pratica.
Eu compreendi sua necessidade.
Trabalhar com datas em campos char/varchar e inoportunuo. Acarreta diversos problemas(tipo de separador de data, formato da data.;
Lhe disse que passei por situacao parecida e a solucao que encontrei foi converter o campo para datetime. Ai sempre que preciso inserir um MES/ANO, eu incluo como sendo o primeiro dia do MES/ANO por exemplo;
Desta forma posso trabalhar com pesquisas normalmente em cima do campo.
Creio que esta e a solucao mais pratica.
GOSTEI 0
Facc
02/10/2006
Ola.
Eu compreendi sua necessidade.
Trabalhar com datas em campos char/varchar e inoportunuo. Acarreta diversos problemas(tipo de separador de data, formato da data.;
Lhe disse que passei por situacao parecida e a solucao que encontrei foi converter o campo para datetime. Ai sempre que preciso inserir um MES/ANO, eu incluo como sendo o primeiro dia do MES/ANO por exemplo;
Desta forma posso trabalhar com pesquisas normalmente em cima do campo.
Creio que esta e a solucao mais pratica.
é não vejo outra alternativa...
Então... como posso fazer pra converter esse campo, mas mantendo os dados da tabela? é que eu tenho vários clientes trabalhando com o sistema no momento...
GOSTEI 0
Macario
02/10/2006
Ola.
1º - Verificar necessidade em aumentar a capacidade do campo, se char(07) para char(10) ou se varchar(07) para varcahr(10), pois dos dados existentes exemplo 08/2006 devera ser alterado para 01/08/2006
2º - Verificar todos os relacionamentos envolvendo o CAMPO. tanto para consulta quanto para edicao.
3º - Efetuar um Update na(s) tabela(s) relacionada(s).
Exemplo:
Obs.: Faca isso em um ambiente de teste e posteriormente aplique em producao.
[]´s
1º - Verificar necessidade em aumentar a capacidade do campo, se char(07) para char(10) ou se varchar(07) para varcahr(10), pois dos dados existentes exemplo 08/2006 devera ser alterado para 01/08/2006
2º - Verificar todos os relacionamentos envolvendo o CAMPO. tanto para consulta quanto para edicao.
3º - Efetuar um Update na(s) tabela(s) relacionada(s).
Exemplo:
Update TABELA set CAMPO = ´01/´+CAMPO
Obs.: Faca isso em um ambiente de teste e posteriormente aplique em producao.
[]´s
GOSTEI 0
Facc
02/10/2006
Ola.
1º - Verificar necessidade em aumentar a capacidade do campo, se char(07) para char(10) ou se varchar(07) para varcahr(10), pois dos dados existentes exemplo 08/2006 devera ser alterado para 01/08/2006
2º - Verificar todos os relacionamentos envolvendo o CAMPO. tanto para consulta quanto para edicao.
3º - Efetuar um Update na(s) tabela(s) relacionada(s).
Exemplo:
Obs.: Faca isso em um ambiente de teste e posteriormente aplique em producao.
[]´s
Update TABELA set CAMPO = ´01/´+CAMPO
eu fiz o que vc me disse, porém está dando esse erro no update
Overflow occurred during data type conversion.
conversion error from string ´07/2004´.
GOSTEI 0
Macario
02/10/2006
Ola.
Qual o tipo do campo?(atualmente).
Qual o tipo do campo?(atualmente).
GOSTEI 0
Marco Salles
02/10/2006
sinceramente não entendi pq que mudaram este topico de lugar.. depois de tantas mensagens... :cry: :cry: :cry: :cry:
GOSTEI 0
Facc
02/10/2006
Ola.
Qual o tipo do campo?(atualmente).
ambos são do tipo string (varchar)
GOSTEI 0
Marco Salles
02/10/2006
acho que concatenação no firebird faz assim:
Update TABELA set CAMPO = ´01/´||CAMPO
GOSTEI 0
Marco Salles
02/10/2006
acho que concatenação no firebird faz assim:
Update TABELA set CAMPO = ´01/´||CAMPO
GOSTEI 0
Facc
02/10/2006
[quote:6951d69ffa=´Marco Salles´]acho que concatenação no firebird faz assim:
era isso mesmo!
Valeu pela ajuda
Update TABELA set CAMPO = ´01/´||CAMPO
[/quote:6951d69ffa]era isso mesmo!
Valeu pela ajuda
GOSTEI 0
Facc
02/10/2006
voce pode adaptar meu primeiro select substituindo o extract por substring, e converter o valor para integer utilizando um cast
vc poderia me dar um exemplo de como usar esse substring? e a conversão para inteiro?
GOSTEI 0
Emerson Nascimento
02/10/2006
você pode tentar assim:
select *
from tabela
where
substring(campo from 4 for 4) || substring(campo from 1 for 2)
between
substring(:parametro1 from 4 for 4) || substring(:parametro1 from 1 for 2)
and
substring(:parametro2 from 4 for 4) || substring(:parametro2 from 1 for 2)
dessa segunda forma você passa os parâmetros ´06/2006´ e ´08/2006´ e serão exibidos os registros corretos.
select *
from tabela
where
substring(campo from 4 for 4) || substring(campo from 1 for 2)
between
substring(:parametro1 from 4 for 4) || substring(:parametro1 from 1 for 2)
and
substring(:parametro2 from 4 for 4) || substring(:parametro2 from 1 for 2)
dessa segunda forma você passa os parâmetros ´06/2006´ e ´08/2006´ e serão exibidos os registros corretos.
GOSTEI 0