Duvida com essa SQL - Ajuda

Firebird

02/10/2006

Essa é a SQL
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

Facc

Curtidas 0

Respostas

Campsoft

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 !


GOSTEI 0
Campsoft

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


GOSTEI 0
Facc

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

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


GOSTEI 0
Steve_narancic

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

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.


GOSTEI 0
Vinicius/campolina

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.


GOSTEI 0
Facc

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

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

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.


GOSTEI 0
Facc

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

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:

Update TABELA set CAMPO = ´01/´+CAMPO



Obs.: Faca isso em um ambiente de teste e posteriormente aplique em producao.


[]´s


GOSTEI 0
Facc

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:
Update TABELA set CAMPO = ´01/´+CAMPO
Obs.: Faca isso em um ambiente de teste e posteriormente aplique em producao. []´s



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

Macario

02/10/2006

Ola.


Qual o tipo do campo?(atualmente).


GOSTEI 0
Marco Salles

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

Facc

02/10/2006

Ola. Qual o tipo do campo?(atualmente).



ambos são do tipo string (varchar)


GOSTEI 0
Marco Salles

Marco Salles

02/10/2006

acho que concatenação no firebird faz assim:

Update TABELA set CAMPO = ´01/´||CAMPO



GOSTEI 0
Marco Salles

Marco Salles

02/10/2006

acho que concatenação no firebird faz assim:

Update TABELA set CAMPO = ´01/´||CAMPO



GOSTEI 0
Facc

Facc

02/10/2006

[quote:6951d69ffa=´Marco Salles´]acho que concatenação no firebird faz assim:

Update TABELA set CAMPO = ´01/´||CAMPO
[/quote:6951d69ffa]


era isso mesmo!

Valeu pela ajuda


GOSTEI 0
Facc

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

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.


GOSTEI 0
POSTAR