Comment puis-je fractionner la valeur décimale de la valeur entière?

Supposons que j'ai une valeur de 4.9.

Je voudrais split 4 et .9 … Comment puis-je le faire?

Je pourrais isoler 4 en utilisant FLOOR (). Qu'en est-il du .9? Comment puis-je l'isoler?

J'utilise t-sql sql server 2005/2008

4.9%1 

Vous pouvez faire le module split 1.

 Declare @money money Set @money = 418.75 Select convert(int,@money - (@money % 1)) as 'LeftPortion' ,convert(int, (@money % 1) * 100) as 'RightPortion' 

Le plus facile que je puisse penser serait

 SELECT IntegerPart = cast(4.9 AS int), DecimalPart = 4.9 - cast(4.9 AS int) 

De nombreux process d'import de données mainframe (malheureusement répandus dans le secteur financier) nécessitent un file d'input de colonne à largeur fixe qui définit des nombres à floating point avec quelques colonnes pour la valeur entière et quelques colonnes pour la valeur décimale. C'est à dire qu'ils veulent le nombre 4.019 représenté comme 000401900, où les 4 premiers caractères correspondent à l'entier et les 5 derniers correspondent à la composante décimale.

Pour cette application, vous devez faire une bonne quantité de manipulation de strings, mais un bon début est d'get une requête qui vous donne deux champs contenant 4 et '01900'.

Parsename () couplé à str () fait l'affaire:

 select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1) 

str () pads avec des espaces sur la gauche, de sorte que vous avez besoin de lsortingm pour l'entier. Vous pourriez juste lancer un int ici à la place. Parsename ne fait que parser les jetons de string séparés par des points.

Voici un gotcha avec cette méthode. Veillez à ne pas embrouiller le type de données de votre colonne decimal_part:

 select integer_part = 1, decimal_part = 4 union all select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1) 

résulte en:

 integer_part decimal_part 1 4 4 1900 

Ici le '01900' prévu est devenu 1900. Ainsi:

 select integer_part = 1, decimal_part = cast(4 as varchar(32)) union all select integer_part = lsortingm(str(4.019,25,0)), decimal_part = parsename(str(4.019, 25, 5),1) 

résulte en:

 integer_part decimal_part 1 4 4 01900 
 Declare @dec decimal(8,2) Set @dec = 23.98 Select Left(@dec, CharIndex('.',@dec)-1) as 'LeftPortion', RIGHT(@Dec, len(@dec) - CharIndex('.',@dec)) as 'RightPortion' 

Jetez un oeil à la fonction parsename. Je pense que le code ci-dessous produira les résultats souhaités. select parsename (4.9,2) donne le 4 select parsename (4.9,1) donne le 9 La sortie de parsename peut être directement utilisée comme un nombre tel que select parsename (4.9,2) * 2 donne le vaule 8

Une autre méthode est

select 4.9-CAST (4.9 comme entier)

Une façon de convertir en utilisant PatIndex est la suivante

 declare @val nvarchar(10) = '4.9' select LEFT(@val,PATINDEX(N'%[.]%', @val)-1) Int_Val, RIGHT( @val, len(@val) - PATINDEX(N'%[.]%', @val) + 1) Dec_Val 

J'ai essayé différentes façons, mais celle-ci ressemble au meilleur qui a bien fonctionné pour moi.

– Pour les numbers

 Select Left(COLUMN_NAME, Case When CharIndex('.',COLUMN_NAME) = 0 Then 0 Else CharIndex('.',COLUMN_NAME)-1 END) as 'LeftPortion', RIGHT(COLUMN_NAME, len(COLUMN_NAME) - CharIndex('.',COLUMN_NAME)) as 'RightPortion' From TABLE_NAME 

– Pour find Max Lengths

 Select COLUMN_NAME, MAX(LEN(Left(COLUMN_NAME, Case When Ind = 0 Then 0 Else Ind-1 END))) as LenBeforedecimal, MAX(LEN(Right(COLUMN_NAME, LEN(COLUMN_NAME) - Ind))) as afterdecimal From (Select COLUMN_NAME, CHARINDEX('.', Cast(COLUMN_NAME as varchar(30))) as Ind From TABLE_NAME) a Group BY COLUMN_NAME