কীভাবে এসকিউএল সার্ভারে ভাসা ভাসাতে রূপান্তর করবেন


130

আমার কাছে বিভিন্ন দৈর্ঘ্যের সংখ্যার সাথে একটি ফ্লোট কলাম রয়েছে এবং আমি সেগুলি ভারচরে রূপান্তর করার চেষ্টা করছি।

কিছু মান বিগিন্ট সর্বাধিক আকারের চেয়ে বেশি, সুতরাং আমি এর মতো কিছু করতে পারি না

cast(cast(float_field as bigint) as varchar(100))

আমি দশমিকটি ব্যবহার করার চেষ্টা করেছি, তবে সংখ্যাগুলি একই আকারের নয়, সুতরাং এটিও খুব একটা কার্যকর হয় না

CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))

কোন সাহায্য প্রশংসা করা হয়।

হালনাগাদ:

নমুনার মান 2.2000012095022E + 26


cast(float_field as varchar(max))অন্যথায় আমি প্রশ্নটি পাই না
ডেনিস ভালিভ

5
আপনার কাস্টের মানটি 2.2e + 026। সম্ভবত আপনি প্রশ্নটি পাবেন না :)
hgulyan

উত্তর:


246

STR()ফাংশনটি ব্যবহার করে দেখুন ।

SELECT STR(float_field, 25, 5)

স্ট্রিট () ফাংশন


আরেকটি নোট: ফাঁকা স্থান সহ বাম দিকে এই প্যাডগুলি। এটি যদি সমস্যা হয় তবে এর সাথে একত্রিত করুন LTRIM:

SELECT LTRIM(STR(float_field, 25, 5))

3
আমি পেয়ে গেলাম ************************* ওটা কী? :)
hgulyan

4
@ hgulyan - Select LTRIM(Str(float_field, 38, 0))আপনার ডেটা জন্য কাজ করে?
মার্টিন স্মিথ

@ মার্টিন স্মিথ, এটি কাজ করছে বলে মনে হচ্ছে, তবে দশমিকের মতোই, সুতরাং এটির সঠিক মূল্য (শেষ দশটি সংখ্যা শূন্য) কিনা আমি নিশ্চিত নই। আমার ধারণা, আসল মান নষ্ট হয়ে গেছে। ধন্যবাদ!
hgulyan

2
@ হুগলিয়ান - শেষ দশটি সংখ্যা শূন্য কারণ এটি Strফাংশনে সর্বশেষ পরামিতিটি । দশমিক বিন্দুর পরে অঙ্কের সংখ্যা। আপনি যে লিঙ্কটি পোস্ট করেছেন তা কি পড়েছেন? শূন্যটি 10 ​​তে পরিবর্তন করুন Select LTRIM(Str(float_field, 38, 10))
কোডিংবাজার

4
আমার ইচ্ছা এসএসএমএস-এ কোনও সতর্কতা ছিল "হেই, আপনি যখন সেই ভ্রান্ত ভাসমান টেলিফোন ক্ষেত্রটিকে পাঠ্যে রূপান্তর করবেন, তখন বৈজ্ঞানিক স্বরলিপি সহ একটি সুন্দর টেলিফোন নম্বর পেতে প্রস্তুত থাকুন! আমরা প্রথমে ltrim (str) তেমন স্মার্ট নই ..."
pkExec 26'15

42

আমি খুঁজে পাওয়া একমাত্র কোয়েরি বিটটি দেখতে পেয়েছে ঠিক একই মূল সংখ্যাটি

CONVERT (VARCHAR(50), float_field,128)

Http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html দেখুন

উপরের অন্যান্য সমাধানগুলি কখনও কখনও গোল হবে বা শেষে অঙ্কগুলি যুক্ত করবে

আপডেট : নীচের মতামত অনুসারে এবং আমি https://msdn.microsoft.com/en-us/library/ms187928.aspx এ দেখতে পাচ্ছি :

CONVERT (VARCHAR(50), float_field,3)

নতুন এসকিউএল সার্ভার সংস্করণগুলিতে ব্যবহার করা উচিত (আজুর এসকিউএল ডেটাবেস, এবং এসকিউএল সার্ভার ২০১ 2016 আরসি 3-তে শুরু হবে)


2
@ অ্যাডিনাসের জন্য +1, ফ্লোট মানটি হিসাবে রূপান্তরিত হয় তবে 0ফ্লোট মান ব্যতীত রূপান্তরিত হয় 0.0E0। আমার যখন ভাসমান ক্ষেত্রটি কখন এবং যেমন হয় তেমন varcharপ্রদর্শন করতে আমার রূপান্তর করতে হবে। আমি নীচে क्वेরিতে বিবৃতি যোগ করে এটি অর্জন করেছি ; NANULL0CASECASE WHEN float_field IS NULL THEN 'NA' WHEN float_field = 0 THEN '0' ELSE CONVERT(VARCHAR, float_field, 128) END AS float_As_VChar
ফুজিএফএক্স

2
মাইক্রোসফ্ট - এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms187928.aspx- তে দস্তাবেজ অনুসারে , 128 সিনট্যাক্সটি উত্তরাধিকারসূত্রে কারণে অন্তর্ভুক্ত করা হয়েছে এবং ভবিষ্যতের সংস্করণে অবজ্ঞাত হতে পারে
মাইক টার্নার

1
128 হ্রাস করা হয়েছে তবে 3 এটি সর্বাধিক সাম্প্রতিক এসকিউএল সার্ভারের প্রকাশের ক্ষেত্রে প্রতিস্থাপন বলে মনে হচ্ছে।
ব্যবহারকারীর 3524983

13

এই সমাধানটি আমি স্ক্য্লসারবারে 2012 এ শেষ করেছিলাম (যেহেতু অন্যান্য সমস্ত পরামর্শের মধ্যে ভগ্নাংশের অংশ বা অন্য কোনও ত্রুটি কাটা ছিল) draw

declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');

আউটপুট:

1000000000.1234

হাজার হাজার বিভাজক এবং স্থানীয়করণ সহজ করার জন্য এর আরও সুবিধা রয়েছে (আমার ক্ষেত্রে)

select format(@float, N'#,##0.##########', 'de-DE');

আউটপুট:

1.000.000.000,1234

3

দরকারী বিষয় ধন্যবাদ।

আপনি যদি আমার মত চান তবে নেতৃত্ব শূন্য অপসারণ করতে পারেন আপনি এটি ব্যবহার করতে পারেন:

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')

2

ভাসা শুধুমাত্র একটি সর্বাধিক আছে। 15 অঙ্কের নির্ভুলতা 15 তম অবস্থানের পরে অঙ্কগুলি এলোমেলো এবং বিগিন্টে (সর্বাধিক 19 অঙ্ক) রূপান্তর বা দশমিক আপনাকে সাহায্য করবে না।


আমি পাই না। ক্ষেত্রের মান 2.2000012095022E + 26। সমাধান কি? কিছু নেই?
hgulyan

মূল মানটিতে সঞ্চিত ডিজিটের চেয়ে বেশি স্ট্রিংতে রূপান্তর করে আপনি আরও অঙ্ক পেতে পারেন না।
devio

সুতরাং আমি কি 15 তম অবস্থানের পরে অঙ্কগুলি হারিয়েছি?
hgulyan

ডেটা নিয়ে এক ধরণের সমস্যা ছিল। আমাকে কেবল 15 মানের ফ্লোট সহ সেই মানটি আপডেট করতে হবে। আমি আপনার উত্তরটি গ্রহণ করব, কারণ এটি এই ডেটা নিয়ে আমার যে প্রধান সমস্যা ছিল তা বর্ণনা করে। ধন্যবাদ.
hgulyan

2

এটি গোল না করে সহায়তা করতে পারে

declare @test float(25)

declare @test1 decimal(10,5)

select @test = 34.0387597207
select @test
set @test1 = convert (decimal(10,5), @test)
select cast((@test1) as varchar(12))


Select  LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)

2

integerপ্রথম এবং তার পরে রূপান্তর করুন string:

cast((convert(int,b.tax_id)) as varchar(20))

এটি দশমিকের পরে অঙ্কগুলি সরিয়ে ফেলবে, যদি থাকে তবে। সুতরাং, এই সমাধানটি সঠিক নয়।
রুশভজি

2

এটি চেষ্টা করুন, কাজ করা উচিত:

cast((convert(bigint,b.tax_id)) as varchar(20))

1

আপনি যদি সিএলআর ফাংশন ব্যবহার করেন তবে আপনি অতিরিক্ত 0 টি শেষ না করেই ফ্লোটটিকে স্ট্রিতে রূপান্তর করতে পারেন যা ভাসমানের মতো দেখাচ্ছে।

সিএলআর ফাংশন

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
[return: SqlFacet(MaxSize = 50)]
public static SqlString float_to_str(double Value, int TruncAfter)
{
  string rtn1 = Value.ToString("R");
  string rtn2 = Value.ToString("0." + new string('0', TruncAfter));

  if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
}

উদাহরণ

create table #temp (value float)
insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)

select value,
       dbo.float_to_str(value, 18) as converted,
       case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
from   #temp

drop table #temp

আউটপুট

value                  converted                  same
---------------------- -------------------------- -----------
0.73                   0.73                       1
0                      0                          1
0.63921                0.63921                    1
-0.70945               -0.70945                   1
0.28                   0.28                       1
0.72000002861023       0.72000002861023           1
3.7                    3.7                        1
-0.01                  -0.01                      1
0.86                   0.86                       1
0.55489                0.55489                    1
0.439999997615814      0.439999997615814          1

বিচারকার্য স্থগিত রাখার আদেশ

সমস্ত রূপান্তরিত স্ট্রিংগুলি 18 দশমিক জায়গায় কাটা হয়েছে এবং কোনও পিছনে জিরো নেই। 18 অঙ্কের নির্ভুলতা আমাদের জন্য সমস্যা নয়। এবং, আমাদের এফপি সংখ্যাগুলির 100% (100,000 মানের কাছাকাছি) স্ট্রিংয়ের মানগুলির মতো দেখতে তারা এফপি সংখ্যার হিসাবে ডাটাবেসে থাকে।


0

নির্দিষ্ট ক্ষেত্রে যেমন অ্যাক্সেলের প্রতিক্রিয়া কিছুটা হলেও এটি অনাকাঙ্ক্ষিত ফলাফল আনবে।

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')

0
select replace(myFloat, '', '')

থেকে প্রতিস্থাপন () ডকুমেন্টেশন :

যদি ইনপুট আর্গুমেন্টগুলির মধ্যে একটি এনভারচর ডেটা টাইপের হয় তবে এনভারচরকে ফেরত দেয়; অন্যথায়, প্রতিস্থাপন বার্চার দেয়।
আর্গুমেন্টগুলির মধ্যে যে কোনও একটি নুল হলে NULL প্রদান করে।

পরীক্ষা:
নাল ==> [নুল]
1.11 ==> 1.11
1.10 ==> 1.1
1.00 ==> 1
0.00 ==> 0
-1.10 ==> -1.1
0.00001 ==> 1e-005
0.000011 ==> 1.1e- ২005


0


Castালাই নির্বাচন করুন (রূপান্তর (দশমিক (15,2), এসএস_ডেইলি_ডিবিট), '।', ',') বার্তা (20%) হিসাবে

এসিএস_সামগ্রী_র বিবরণ থেকে


0

আণবিকের উত্তরের ভিত্তিতে:

DECLARE @F FLOAT = 1000000000.1234;
SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;

SET @F = 823399066925.049
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

SET @F = 0.502184537571209
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

0

আমি সবেমাত্র একটি একই পরিস্থিতি পেরিয়ে এসেছি এবং এসএসএমএস ভি 17.9.1 / এসকিউএল 2017 এর মধ্যে উপস্থাপিত 'খুব বড় সংখ্যক' এর গোলাকার বিষয়গুলি দেখে অবাক হয়েছি।

আমি প্রস্তাব দিচ্ছি না যে আমার কাছে একটি সমাধান রয়েছে, তবে আমি পর্যবেক্ষণ করেছি যে ফরমেট উপস্থাপন করে একটি সংখ্যা যা সঠিক বলে মনে হয়। আমি বোঝাতে পারি না এটি আরও গোলাকার সমস্যাগুলি হ্রাস করে বা জটিল গাণিতিক ক্রিয়াকলাপের মধ্যে দরকারী।

টি SQL কোড সরবরাহকৃত যা করা উচিত অন্যরা সক্রিয় তাদের কোড পরীক্ষা করার জন্য এবং ধারনা উঠা দরকার উচিত পরিষ্কারভাবে আমার পর্যবেক্ষণ প্রদর্শন।

WITH Units AS 
(
   SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription
   UNION ALL
   SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription
   UNION ALL
   SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription
   UNION ALL
   SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription
   UNION ALL
   SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription
   UNION ALL
   SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription
   UNION ALL
   SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription
   UNION ALL
   SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription
   UNION ALL
   SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription
   UNION ALL
   SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription
   UNION ALL
   SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription
   UNION ALL
   SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription
   UNION ALL
   SELECT 33.0  AS [RaisedPower] , 'Decillion' As UnitDescription

)

SELECT UnitDescription

   ,              POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )                                                             AS ReturnsFloat
   ,        CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) )                                        AS RoundingIssues
   , STR(   CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) ) ,   CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues
   , FORMAT(      POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  , '0')                                                     AS NicelyFormatted

FROM Units
ORDER BY [RaisedPower]

0
SELECT LTRIM(STR(float_field, 25, 0))

সেরা উপায় যাতে আপনি যোগ না .0000করেন এবং মান শেষে কোনও অঙ্ক হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.