Comment puis-je obtenir uniquement les nombres après la décimale?
Exemple: 2.938
= 938
une manière, fonctionne aussi pour les valeurs négatives
declare @1 decimal(4,3)
select @1 = 2.938
select PARSENAME(@1,1)
essaye ça:
SELECT (num % 1)
Vous pouvez utiliser FLOOR
:
select x, ABS(x) - FLOOR(ABS(x))
from (
select 2.938 as x
) a
Sortie:
x
-------- ----------
2.938 0.938
Ou vous pouvez utiliser 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
Une approche plus généralisée pourrait consister à fusionner PARSENAME et% operator. (comme répondu dans deux des réponses ci-dessus)
Résultats selon la 1ère approche ci-dessus par SQLMenace
select PARSENAME(0.001,1)
Résultat: 001
select PARSENAME(0.0010,1)
Résultat: 0010
select PARSENAME(-0.001,1)
Résultat: 001
select PARSENAME(-1,1)
Résultat: -1 -> Ne doit pas renvoyer de partie entière
select PARSENAME(0,1)
Résultat: 0
select PARSENAME(1,1)
Résultat: 1 -> Ne doit pas renvoyer de partie entière
select PARSENAME(100.00,1)
Résultat: 00
Résultats selon la 1ère approche ci-dessus par Pavel Morshenyuk "0." fait partie du résultat dans ce cas.
SELECT (100.0001 % 1)
Résultat: 0.0001
SELECT (100.0010 % 1)
Résultat: 0.0010
SELECT (0.0001 % 1)
Résultat: 0.0001
SELECT (0001 % 1)
Résultat: 0
SELECT (1 % 1)
Résultat: 0
SELECT (100 % 1)
Résultat: 0
Combinant les deux:
SELECT PARSENAME((100.0001 % 1),1)
Résultat: 0001
SELECT PARSENAME((100.0010 % 1),1)
Résultat: 0010
SELECT PARSENAME((0.0001 % 1),1)
Résultat: 0001
SELECT PARSENAME((0001 % 1),1)
Résultat: 0
SELECT PARSENAME((1 % 1),1)
Résultat: 0
SELECT PARSENAME((100 % 1),1)
Résultat: 0
Mais il reste encore un problème: le zéro après que les nombres non nuls fassent partie du résultat (exemple: 0.0010 -> 0010). Peut-être faut-il appliquer une autre logique pour supprimer cela.
Le hack habituel (qui varie un peu dans la syntaxe) est
x - floor(x)
C'est la partie décimale. Pour en faire un entier, mettez-le à l'échelle.
(x - floor(x)) * 1000
Rendez-le très simple par requête:
select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;
Mettez votre numéro ou nom de colonne à la place 123.122
Si vous savez que vous voulez les valeurs au millième, placez, c'est
SELECT (num - FLOOR(num)) * 1000 FROM table...;
Si vous souhaitez sélectionner uniquement des nombres décimaux, utilisez cette clause WHERE:
(CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT)) <> 0
Si vous voulez une liste claire, vous pouvez trier par décimal/entier:
CASE WHEN 0 = CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type