2010-08-05 34 views

Respuesta

42

una manera, funciona también para los valores negativos

declare @1 decimal(4,3) 
select @1 = 2.938 

select PARSENAME(@1,1) 
+1

¿Y qué ocurre si el valor es .042 solo devuelve 42? – user380432

+0

no, devuelve 042, ambos devuelven 042 -> SELECCIONAR PARSENAME (0.042,1), PARSENAME (.042,1) – SQLMenace

+0

Si solo desea 42, seleccione cast (PARSENAME (@ 1,1) como int) –

12

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 
+1

Ahora pruébelo para los números negativos: 'SELECT -0.25 - FLOOR (-0.25)' da 0.75. –

+2

Se agregó [ABS] (http://msdn.microsoft.com/en-us/library/ms189800%28SQL.90%29.aspx) para manejar números negativos ... –

+0

Me gusta convertir a varchar y usar el índice de. para substr, funciona para cualquier lugar decimal. –

4

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 
0

Si sabe que desea que los valores a las milésimas, lugar, es

SELECT (num - FLOOR(num)) * 1000 FROM table...; 
105

probar esto:

SELECT (num % 1) 
+3

+1 también funciona en PostgreSQL – Conan

+8

Parece que solo funciona si num si es DECIMAL. Falla cuando num es un FLOAT. – dsz

+0

En casos como SELECT (100,0001% 1) el resultado mostrado contiene '0.' parte, eso es 0.0001. Pero según la pregunta requerida, la parte es '0001' –

0

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

-1

Puede usar nada más:

select RIGHT(123.45,2) return => 45 
+1

Esta publicación se marca automáticamente como de baja calidad porque es muy corta. ¿Le importaría expandirlo agregando algo de texto para explicar cómo esto resuelve el problema? – gung

+0

El segundo parámetro depende de cuántos decimales tiene su tipo de datos. – jumxozizi

2

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.

-1

CAST ('' DERECHA (MiCampo, LEN (MiCampo) -CHARINDEX (, MiCampo) 1) como float)

0

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 
Cuestiones relacionadas