Come ottengo solo i numeri dopo il decimale?SQL - Come ottengo solo i numeri dopo il decimale?
Esempio: 2.938
= 938
Come ottengo solo i numeri dopo il decimale?SQL - Come ottengo solo i numeri dopo il decimale?
Esempio: 2.938
= 938
un modo, funziona anche per i valori negativi
declare @1 decimal(4,3)
select @1 = 2.938
select PARSENAME(@1,1)
Quindi cosa succede se il valore è .042 restituisce solo 42 allora? – user380432
no, restituisce 042, entrambi restituiscono 042 -> SELECT PARSENAME (0.042,1), PARSENAME (.042,1) – SQLMenace
Se si desidera solo 42, quindi selezionare cast (PARSENAME (@ 1,1) come int) –
È possibile utilizzare FLOOR
:
select x, ABS(x) - FLOOR(ABS(x))
from (
select 2.938 as x
) a
uscita:
x
-------- ----------
2.938 0.938
Oppure si può utilizzare 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
Ora provalo per i numeri negativi: 'SELECT -0.25 - FLOOR (-0.25)' fornisce 0,75. –
Aggiunto [ABS] (http://msdn.microsoft.com/en-us/library/ms189800%28SQL.90%29.aspx) per gestire numeri negativi ... –
Mi piace convertire in un varchar e utilizzare l'indice di su substr, funziona per qualsiasi posizione decimale. –
Il solito trucco (che varia un po 'di sintassi) è
x - floor(x)
Questa è la parte frazionaria. Per trasformarlo in un numero intero, ridimensionarlo.
(x - floor(x)) * 1000
Se si sa che si desidera che i valori ai millesimi, posto, è
SELECT (num - FLOOR(num)) * 1000 FROM table...;
provare questo:
SELECT (num % 1)
rendere molto semplice da query:
select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;
Inserisci il tuo numero o il nome della colonna invece 123.122
È possibile utilizzare DESTRA:
select RIGHT(123.45,2) return => 45
approccio più generalizzato può essere di fondere ParseName e% dell'operatore.(Come ha risposto in due delle risposte di cui sopra)
risultati come al primo approccio di cui sopra da SQLMenace
select PARSENAME(0.001,1)
Risultato: 001
select PARSENAME(0.0010,1)
Risultato: 0010
select PARSENAME(-0.001,1)
Risultato : 001
select PARSENAME(-1,1)
risultati: -1 -> non deve restituire parte intera
select PARSENAME(0,1)
risultati: 0
select PARSENAME(1,1)
risultati: 1 -> non deve restituire parte intera
select PARSENAME(100.00,1)
Risultato: 00
Risultati come per primo approccio sopra di Pavel Morshenyuk "0". è parte del risultato in questo caso.
SELECT (100.0001 % 1)
Risultato: 0,0001
SELECT (100.0010 % 1)
Risultato: 0,0010
SELECT (0.0001 % 1)
Risultato: 0.0001
SELECT (0001 % 1)
Risultato: 0
SELECT (1 % 1)
Risultato: 0
SELECT (100 % 1)
Risultato: 0
Combinando entrambi:
SELECT PARSENAME((100.0001 % 1),1)
Risultato: 0001
SELECT PARSENAME((100.0010 % 1),1)
Risultato: 0010
SELECT PARSENAME((0.0001 % 1),1)
Risultato: 0001
SELECT PARSENAME((0001 % 1),1)
Risultato: 0
SELECT PARSENAME((1 % 1),1)
Risultato: 0
01.235.SELECT PARSENAME((100 % 1),1)
Risultato: 0
Ma ancora una questione che resta è lo zero dopo che i numeri da zero non sono parte del risultato (Esempio: 0,0010 -> 0010). Potrebbe essere necessario applicare qualche altra logica per rimuoverlo.
CAST ('' DESTRA (MyField, LEN (MyField) -CHARINDEX (, MyField) +1) come float)
Se si desidera selezionare solo i numeri decimali utilizzare questa clausola WHERE:
(CAST(RIGHT(Myfield, LEN(Myfield)-CHARINDEX('.',Myfield)+1) AS FLOAT)) <> 0
Se si desidera un elenco chiaro è possibile ordinare per decimali/intero:
CASE WHEN 0 = CAST(RIGHT(Myfield, LEN(Myfield)-CHARINDEX('.',Myfield)+1) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type
Sarebbe -2.938 restituire 938 anche? –