¿Cómo obtengo solo los números después del decimal?SQL - ¿Cómo obtengo solo los números después del decimal?
Ejemplo: 2.938
= 938
¿Cómo obtengo solo los números después del decimal?SQL - ¿Cómo obtengo solo los números después del decimal?
Ejemplo: 2.938
= 938
una manera, funciona también para los valores negativos
declare @1 decimal(4,3)
select @1 = 2.938
select PARSENAME(@1,1)
¿Y qué ocurre si el valor es .042 solo devuelve 42? – user380432
no, devuelve 042, ambos devuelven 042 -> SELECCIONAR PARSENAME (0.042,1), PARSENAME (.042,1) – SQLMenace
Si solo desea 42, seleccione cast (PARSENAME (@ 1,1) como int) –
Puede utilizar FLOOR
:
select x, ABS(x) - FLOOR(ABS(x))
from (
select 2.938 as x
) a
Salida:
x
-------- ----------
2.938 0.938
O puede utilizar SUBSTRING
:
select x, SUBSTRING(cast(x as varchar(max)), charindex(cast(x as varchar(max)), '.') + 3, len(cast(x as varchar(max))))
from (
select 2.938 as x
) a
Ahora pruébelo para los números negativos: 'SELECT -0.25 - FLOOR (-0.25)' da 0.75. –
Se agregó [ABS] (http://msdn.microsoft.com/en-us/library/ms189800%28SQL.90%29.aspx) para manejar números negativos ... –
Me gusta convertir a varchar y usar el índice de. para substr, funciona para cualquier lugar decimal. –
El truco habitual (que varía un poco en la sintaxis) es
x - floor(x)
Esa es la parte fraccionaria. Para convertirlo en un entero, escalarlo.
(x - floor(x)) * 1000
Si sabe que desea que los valores a las milésimas, lugar, es
SELECT (num - FLOOR(num)) * 1000 FROM table...;
probar esto:
SELECT (num % 1)
hacen que sea muy sencillo de consulta:
select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;
Ponga su número o nombre de columna en su lugar 123.122
Puede usar nada más:
select RIGHT(123.45,2) return => 45
enfoque más generalizado puede ser la de fusionar y ParseName% del operador.(Como respondida en dos de las respuestas anteriores)
Resultados como por primera enfoque anterior por SQLMenace
select PARSENAME(0.001,1)
Resultado: 001
select PARSENAME(0.0010,1)
Resultado: 0010
select PARSENAME(-0.001,1)
Resultado : 001
select PARSENAME(-1,1)
Resultado: -1 -> no volviesen número entero parte
select PARSENAME(0,1)
Resultado: 0
select PARSENAME(1,1)
Resultado: 1 -> no volviesen número entero parte
select PARSENAME(100.00,1)
Resultado: 00
Resultados como según el primer enfoque anterior de Pavel Morshenyuk "0". es parte del resultado en este caso.
SELECT (100.0001 % 1)
Resultado: 0,0001
SELECT (100.0010 % 1)
Resultado: 0,0010
SELECT (0.0001 % 1)
Resultado: 0.0001
SELECT (0001 % 1)
Resultado: 0
SELECT (1 % 1)
Resultado: 0
SELECT (100 % 1)
Resultado: 0
Combinando ambos:
SELECT PARSENAME((100.0001 % 1),1)
Resultado: 0001
SELECT PARSENAME((100.0010 % 1),1)
Resultado: 0010
SELECT PARSENAME((0.0001 % 1),1)
Resultado: 0001
SELECT PARSENAME((0001 % 1),1)
Resultado: 0
SELECT PARSENAME((1 % 1),1)
Resultado: 0
SELECT PARSENAME((100 % 1),1)
Resultado: 0
Pero sigue siendo una cuestión que queda es el cero después de los números cero no son parte del resultado (Ejemplo: 0,0010 -> 0010). Puede ser uno tiene que aplicar alguna otra lógica para eliminar eso.
CAST ('' DERECHA (MiCampo, LEN (MiCampo) -CHARINDEX (, MiCampo) 1) como float)
Si desea seleccionar sólo los números decimales utilizar esta cláusula WHERE:
(CAST(RIGHT(Myfield, LEN(Myfield)-CHARINDEX('.',Myfield)+1) AS FLOAT)) <> 0
Si desea una lista clara se puede ordenar por decimal/entero:
CASE WHEN 0 = CAST(RIGHT(Myfield, LEN(Myfield)-CHARINDEX('.',Myfield)+1) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type
¿Sería volver -2.938 938 también? –