Comando SQL
Gostaria de saber se existe algum comando para apagar os 2 ultimos digitos de um registro.
ex:
29814 --> 298
508550 --> 5085
o campo e inteiro e uso firebird 1.5
ex:
29814 --> 298
508550 --> 5085
o campo e inteiro e uso firebird 1.5
Rjcerri
Curtidas 0
Respostas
Vinicius2k
02/09/2004
Colega,
Vc quer apenas eliminar ? não precisa fazer nada com o ´resto´?
Se for...
ou simplesmente :
T+
Vc quer apenas eliminar ? não precisa fazer nada com o ´resto´?
Se for...
update TABELA set CAMPO = cast((CAMPO / 100) as integer);
ou simplesmente :
update TABELA set CAMPO = (CAMPO / 100);
T+
GOSTEI 0
Rjcerri
02/09/2004
Não quero nada com o resto,, tentei as duas formas e ele arredonda o resultado ex: 508558/100 = 5085,5 ai ele da o resultado de 5086 e esse numero e de outro produto.
GOSTEI 0
Vinicius2k
02/09/2004
Colega,
Aonde exatamente vc está executando e qual a instrução ? Se seu campo for [b:2fd1323c29]realmente INTEGER[/b:2fd1323c29] não existe arrendondamento... ele é simplesmente truncado... por via das dúvidas acabei de testar os exemplos diretamente no banco com IBExpert e dentro de uma aplicação usando dbExpress e IBX... e com um select :
Na base tenho : 199, 299 e 399 e o retorno é 1, 2 e 3...
T+
Aonde exatamente vc está executando e qual a instrução ? Se seu campo for [b:2fd1323c29]realmente INTEGER[/b:2fd1323c29] não existe arrendondamento... ele é simplesmente truncado... por via das dúvidas acabei de testar os exemplos diretamente no banco com IBExpert e dentro de uma aplicação usando dbExpress e IBX... e com um select :
select (CAMPO/100) as CAMPO_TRUNCADO from TABELA
Na base tenho : 199, 299 e 399 e o retorno é 1, 2 e 3...
T+
GOSTEI 0
Rjcerri
02/09/2004
Estou usando no ibexpert, e o campo e integer, e estou usando a opcao update balcao set idpadrao=(idpadrao/100); e esta arrendondano. 508550 fica 5086
GOSTEI 0
Vinicius2k
02/09/2004
:shock:
Honestamente, não sei o que pode ser... já fiz e refiz os testes aqui e sempre tenho o resultado q vc precisa... seja com selects ou com update set ele sempre trunca...
Eu mesmo, em meus projetos, já utilizei-me disso...
T+
Honestamente, não sei o que pode ser... já fiz e refiz os testes aqui e sempre tenho o resultado q vc precisa... seja com selects ou com update set ele sempre trunca...
Eu mesmo, em meus projetos, já utilizei-me disso...
T+
GOSTEI 0
Afarias
02/09/2004
Interessante -- até onde sei ele ARREDONDA e não TRUNCA quando se faz um CAST AS INTEGER -- qual a versão do seu IB (ou FB) Vinícius?
T+
T+
GOSTEI 0
Vinicius2k
02/09/2004
Estou com o FB 1.5.1 -- estranho... para mim o correto era o contrário...
E eu use isso semana passada migrando uma base Clipper (Numeric), exportado SDF os campos de ID ficaram com 2 decimais e eu tive que corrigir...
Será que eh diferença de versão? Eu nem usei cast... fiz o update set direto com o campo / 100... só passei a instrução com cast para o colega pq julguei q era mais correta, mesmo a outra tendo funcionado...
T+
E eu use isso semana passada migrando uma base Clipper (Numeric), exportado SDF os campos de ID ficaram com 2 decimais e eu tive que corrigir...
Será que eh diferença de versão? Eu nem usei cast... fiz o update set direto com o campo / 100... só passei a instrução com cast para o colega pq julguei q era mais correta, mesmo a outra tendo funcionado...
T+
GOSTEI 0
Vinicius2k
02/09/2004
Acho q encontrei a resposta...
[quote:16bf66501d=´Firebird QuickStartGuide.pdf, página 19,´][b:16bf66501d][u:16bf66501d]Division of an integer by an integer[/u:16bf66501d][/b:16bf66501d]
Firebird accords with the SQL standard by [color=red:16bf66501d]truncating the result (quotient) of an integer/integer calculation to
the next lower integer[/color:16bf66501d]. This can have bizarre results unless you are aware of it.
For example, this calculation is correct in SQL:
1 / 3 = 0
If you are upgrading from a RDBMS which resolves integer/integer division to a float quotient, you will need to
alter any affected expressions to use a float or scaled numeric type for either dividend, divisor, or both.
For example, the calculation above could be modified thus in order to produce a non-zero result:
1.000 / 3 = 0.333[/quote:16bf66501d]
Só não sei dizer se é só para o FB 1.5...
T+
[quote:16bf66501d=´Firebird QuickStartGuide.pdf, página 19,´][b:16bf66501d][u:16bf66501d]Division of an integer by an integer[/u:16bf66501d][/b:16bf66501d]
Firebird accords with the SQL standard by [color=red:16bf66501d]truncating the result (quotient) of an integer/integer calculation to
the next lower integer[/color:16bf66501d]. This can have bizarre results unless you are aware of it.
For example, this calculation is correct in SQL:
1 / 3 = 0
If you are upgrading from a RDBMS which resolves integer/integer division to a float quotient, you will need to
alter any affected expressions to use a float or scaled numeric type for either dividend, divisor, or both.
For example, the calculation above could be modified thus in order to produce a non-zero result:
1.000 / 3 = 0.333[/quote:16bf66501d]
Só não sei dizer se é só para o FB 1.5...
T+
GOSTEI 0
Afarias
02/09/2004
|Eu nem usei cast... fiz o update set direto com o campo / 100.
Ahhh.. bom :)
T+
Ahhh.. bom :)
T+
GOSTEI 0
Rjcerri
02/09/2004
O que devo fazer? aquela mensagem em ingles não me ajudou muito.
GOSTEI 0
Vinicius2k
02/09/2004
Bem, na verdade aquela mensagem está dizendo que o que vc está tentando fazer deveria dar certo...
Como eu disse, honestamente, não sei o que pode estar acontecendo, já que comigo funciona...
afarias, vc pode realizar este teste também?
será que só dá certo comigo? :roll:
Como eu disse, honestamente, não sei o que pode estar acontecendo, já que comigo funciona...
afarias, vc pode realizar este teste também?
update tabela set campo = campo/100
será que só dá certo comigo? :roll:
GOSTEI 0
Afarias
02/09/2004
|afarias, vc pode realizar este teste também?
hehehe... não precisa... neste caso é ´truncado´ sim... não é truncado de verdade, é apenas q é feito uma divisão nos inteiros (pq são 2 números inteiros) e dai...
O q falei q era arrendondado éra o CAST(n as INTEGER)
:D
T+
hehehe... não precisa... neste caso é ´truncado´ sim... não é truncado de verdade, é apenas q é feito uma divisão nos inteiros (pq são 2 números inteiros) e dai...
O q falei q era arrendondado éra o CAST(n as INTEGER)
:D
T+
GOSTEI 0
Vinicius2k
02/09/2004
Bem, se era para funcionar e não funciona fica difícil de entender...
Talvez isso já seja ´apelação´, mas vamos lá :
Colega,
Declare a UDF (Tools->Script Executive no IBExpert):
E tente rodar o update :
Será que agora vai? :roll:
T+
Talvez isso já seja ´apelação´, mas vamos lá :
Colega,
Declare a UDF (Tools->Script Executive no IBExpert):
DECLARE EXTERNAL FUNCTION DIV INTEGER, INTEGER RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT ´IB_UDF_div´ MODULE_NAME ´ib_udf´
E tente rodar o update :
update TABELA set CAMPO = cast(div(CAMPO, 100) as integer)
Será que agora vai? :roll:
T+
GOSTEI 0
Afarias
02/09/2004
o update apenas deve funcionar sim sem problemas, caso o CAMPO seja INTEGER::
caso o CAMPO sesa NUMERIC/FLOAT::
Nestes casos não tem como ´arredondar´ pq o IB (ou FB) fará uma divisão nos inteiros (não há casas decimais)!
T+
update tabela set campo = campo / 100
caso o CAMPO sesa NUMERIC/FLOAT::
update tabela set campo = cast(campo as integer) / 100
Nestes casos não tem como ´arredondar´ pq o IB (ou FB) fará uma divisão nos inteiros (não há casas decimais)!
T+
GOSTEI 0
Rjcerri
02/09/2004
depois que eu declarei a udf funcionou. Obrigado.
GOSTEI 0