2010-10-09 4 views

Répondre

12
4.9%1 

Vous pouvez faire diviser le module 1.

+0

Impressionnant !!! ........... –

+0

@thyrgle .. est pas 0,9 le reste de la division entière 4.9/1? mais la réponse est grande +1 –

+0

@Gaby: Oui, je pense maintenant que j'y pense, mais je me souviens que quelqu'un a dit que ce n'était pas le cas. –

0
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' 
2

Le je peux penser serait plus facile

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

Jetez un coup d'œil à 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 utilisé directement comme un nombre tel que select ParseName (4.9,2) * 2 donne la vaule 8

3
Declare @money money 

Set @money = 418.75 

Select convert(int,@money - (@money % 1)) as 'LeftPortion' 
     ,convert(int, (@money % 1) * 100) as 'RightPortion' 
0

Une autre méthode est

select 4.9 CAST (4.9 int)

1

de nombreux processus d'importation de données mainframe (malheureusement commun dans le industr financier y) nécessitent un fichier d'entrée de colonne à largeur fixe qui définit des nombres à virgule flottante avec quelques colonnes pour la valeur entière et quelques colonnes pour la valeur décimale. C'est à dire. 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 beaucoup de manipulation de chaînes, mais un bon début est d'obtenir une requête qui vous donne deux champs contenant 4 et '01900'.

ParseName() couplée à str() le tour est joué:

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

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

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

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

résultats dans:

integer_part decimal_part 
1 4 
4 1900 

Ici, le devint destiné '01900' 1900.Ainsi:

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

résultats dans:

integer_part decimal_part 
1 4 
4 01900 
0

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 
0

J'ai essayé différentes façons, mais celui-ci ressemble le meilleur qui a fonctionné pour moi plutôt bien.

- Pour les chiffres

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 trouver Max Longueurs

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 
Questions connexes