আমার একটি কলাম রয়েছে DECIMAL(9,6)
অর্থাৎ এটি 999,123456 এর মতো মানগুলিকে সমর্থন করে।
তবে আমি যখন 123,4567 এর মতো ডেটা .োকান তখন তা 123,456700 হয়ে যায়
কীভাবে সেই জিরো সরিয়ে ফেলবেন?
আমার একটি কলাম রয়েছে DECIMAL(9,6)
অর্থাৎ এটি 999,123456 এর মতো মানগুলিকে সমর্থন করে।
তবে আমি যখন 123,4567 এর মতো ডেটা .োকান তখন তা 123,456700 হয়ে যায়
কীভাবে সেই জিরো সরিয়ে ফেলবেন?
উত্তর:
একটি decimal(9,6)
দোকানে কমা ডান দিকে 6 টি সংখ্যা। ট্রেলিং শূন্যগুলি প্রদর্শন করা বা না করা কোনও ফর্ম্যাট সিদ্ধান্ত, সাধারণত ক্লায়েন্টের পক্ষেই প্রয়োগ করা হয়।
কিন্তু SSMS ফরম্যাটের যেহেতু float
শূন্য trailing ছাড়া, আপনি কাস্ট করে শূণ্যসমূহ trailing অপসারণ করতে পারেন decimal
একটি থেকে float
:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
মুদ্রণ:
123.456700 123,4567
(আমার দশমিক বিভাজক একটি কমা, তবুও এসএসএমএস বিন্যাসের সাথে দশমিক দশমিক বিন্যাস করে App দৃশ্যত একটি পরিচিত সমস্যা ))
আপনি FORMAT()
ফাংশনটি ব্যবহার করতে পারেন (এসকিএলএজুরি এবং এসকিএল সার্ভার 2012+):
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
ফ্লাট (বা বাস্তব) এর সাথে ব্যবহার করার সময় সতর্কতা অবলম্বন করুন: ব্যবহার করবেন না g17
বৃহত্তর ( g8
বা বাস্তবের সাথে বৃহত্তর), কারণ মেশিনের উপস্থাপনের সীমিত নির্ভুলতা অবাঞ্ছিত প্রভাবগুলির কারণ:
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
এছাড়াও, ডকুমেন্টেশন অনুযায়ী নোট করুন :
ফরমেট .NET ফ্রেমওয়ার্ক কমন ল্যাঙ্গুয়েজ রানটাইম (সিএলআর) এর উপস্থিতির উপর নির্ভর করে। এই ফাংশনটি মুছে ফেলা হবে না কারণ এটি সিএলআর উপস্থিতির উপর নির্ভর করে। সিএলআর প্রয়োজন এমন একটি ফাংশন রিমোট করা দূরবর্তী সার্ভারে ত্রুটির কারণ হতে পারে।
স্ক্যালএজুরেতেও কাজ করে।
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
আমি ভাসা ভাসতে নারাজ কারণ আমার সংখ্যা দশমিক যে ভাসমান উপস্থাপন করতে পারে তার চেয়ে বেশি সংখ্যার হওয়ার সম্ভাবনা রয়েছে
FORMAT
যখন একটি স্ট্যান্ডার্ড। নেট ফর্ম্যাট স্ট্রিং 'জি 8' ব্যবহার করা হয় তখন খুব অল্প দশমিক (যেমন 1e-08) ক্ষেত্রে বৈজ্ঞানিক স্বরলিপি ফিরে আসে যা অনুপযুক্তও ছিল না
একটি কাস্টম বিন্যাসের স্ট্রিং ব্যবহার করে ( https://docs.microsoft.com/en-us/dotnet/standard/base-tyype/custom-numeric-format-strings ) আমি যা চেয়েছিলাম তা অর্জন করতে পেরেছি:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
আপনি যদি চান যে আপনার নম্বরটিতে কমপক্ষে একটি অনুমান শূন্য থাকে, সুতরাং 2.0 ২ হয় না, তবে একটি বিন্যাসের স্ট্রিং ব্যবহার করুন 0.0#####
দশমিক বিন্দু স্থানীয়করণ করা হয়, সুতরাং যে সংস্কৃতিগুলি দশমিক বিভাজক হিসাবে কমা ব্যবহার করে সেখানে একটি কমা আউটপুট আসবে the হয়
অবশ্যই, এটি ডাটা লেয়ারকে ফর্ম্যাটিং করার হতাশার অনুশীলন (তবে আমার ক্ষেত্রে অন্য কোনও স্তর নেই; ব্যবহারকারী আক্ষরিক অর্থে একটি সঞ্চিত প্রক্রিয়া চালাচ্ছেন এবং ফলাফলটি একটি ইমেলটিতে রেখেছেন: /)
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
মুদ্রণ:
2.55
Cast(20.5500 as Decimal(6,2))
এটা করা উচিত।
এটা চেষ্টা কর :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
20.55 দেয়
0.000
ওঠে .
। এখানে SELECT REPLACE(RTRIM(REPLACE(20.5500, "0", " ")), " ", "0")
কেবলমাত্র পিছনের জিরোগুলি ছাঁটাই করার ফিক্সটি রয়েছে
আমার অনুরূপ সমস্যা ছিল, তবে দশমিক বিন্দুটি সরিয়ে ফেলতে হবে যেখানে কোন দশমিক উপস্থিত ছিল না, এখানে আমার সমাধানটি ছিল যা দশমিক दशকটি তার উপাদানগুলিতে বিভক্ত করে এবং দৈর্ঘ্যের দশমিক বিন্দুর স্ট্রিং থেকে যে অক্ষরের সংখ্যাটি গ্রহণ করে তা বেস করে দেয় ভগ্নাংশ উপাদান (CASE ব্যবহার না করে)। বিষয়গুলি আরও আকর্ষণীয় করে তুলতে, আমার নম্বরটি দশমিক ছাড়াই ভাসা হিসাবে সংরক্ষণ করা হয়েছিল।
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
ফলাফলটি বেদনাদায়ক, আমি জানি, তবে উপরের উত্তরগুলি থেকে অনেক সাহায্য নিয়ে আমি সেখানে পৌঁছেছি।
নির্ভুলতার ক্ষতি হবার সম্ভাবনার কারণে রূপান্তর করার আগে সেরা উপায়টি ফ্লোট বা অর্থের সাথে রূপান্তর করা নয় । সুতরাং নিরাপদ উপায়গুলি এরকম কিছু হতে পারে:
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
যেখানে @ মূল্য কোনও দশমিক (x, y) হতে পারে
sp_
সঞ্চিত পদ্ধতিতে, fn_
ফাংশনগুলির tbl
জন্য, টেবিলের জন্য ব্যবহার করি এবং তাই চালু ... এটি প্রয়োজন হয় না তবে এটি আমাদের ডাটাবেসগুলি সজ্জিত করার জন্য সেরা অভ্যাস।
আমার অনুরূপ সমস্যা ছিল, পছন্দ মতো জিরোগুলি ট্রিম করতে হবে xx0000,x00000,xxx000
আমি ব্যবহার করতাম:
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
কোডটি ছাঁটাতে হবে এমন ক্ষেত্রের নাম। আশাকরি এটি কাউকে সাহায্য করবে।
অন্য বিকল্প ...
আমি জানি না এটি কতটা দক্ষ তবে এটি কাজ করে বলে মনে হচ্ছে এবং ভাসমান পথে যায় না:
select replace(rtrim(replace(
replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
, '.', ' ')), ' ', '.')
মাঝের লাইনটি পিছনের জায়গাগুলি থেকে সরে যায়, দশমিক সংখ্যা না থাকলে বাইরের দুটি বিন্দুটি সরিয়ে দেয়
আমার দশমিক দশকে ট্রেলিং শূন্যগুলি সরিয়ে ফেলতে হবে যাতে আমি কেবলমাত্র শীর্ষস্থানীয় শূন্যগুলির সাথে নির্দিষ্ট দৈর্ঘ্যের একটি স্ট্রিং আউটপুট করতে পারি
(যেমনঃ আমার 14 টি অক্ষর আউটপুট করা দরকার যাতে 142.023400 000000142.0234 হয়ে যায়),
আমি ব্যবহৃত parsename
, reverse
এবং cast
as int
চিহ্ন শূন্য মুছে ফেলার জন্য:
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(তারপরে আমার শীর্ষস্থানীয় শূন্যগুলি পেতে আমি উপরের দৈর্ঘ্যের উপর ভিত্তি করে জিরোগুলির সঠিক সংখ্যাটি প্রতিলিপি করতে এবং এটি উপরের সামনের দিকে সংলগ্ন করতে পারি)
আমি এই কারো সাহায্য করে আশা করি।
টিএসকিউএলে শীর্ষস্থানীয় এবং অনুসরণীয় শূন্যগুলি অপসারণ করা সম্ভব
স্ট্রিং না হয়ে এসআরটি টিএসকিউএল ফাংশনটি ব্যবহার করে স্ট্রিংয়ে রূপান্তর করুন
নেতৃস্থানীয় এবং চলমান জিরো উভয়ই সরান
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
ফোরামে আরও তথ্য ।
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
এ কেমন? আপনার ফাংশনে @ এই ডেটা হিসাবে ডেটা চলে আসছেন বলে ধরে নেওয়া:
BEGIN
DECLARE @thisText VARCHAR(255)
SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0')
IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.'
RETURN STUFF(@thisText, LEN(@thisText), 1, '')
RETURN @thisText
END
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
আমি বুঝতে পারি এটি একটি পুরানো পোস্ট তবে এসকিউএল সরবরাহ করতে চাই যা আমি এনেছি
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
এটা চেষ্টা কর.
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
সবচেয়ে সহজ উপায় হ'ল ফ্ল্যাট হিসাবে মানটি কাস্ট করা এবং তারপরে স্ট্রিং ডেটা টাইপ করা।
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
এটা চেষ্টা কর:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
আমি জানি এই থ্রেডটি অনেক পুরানো তবে যারা এসকিউএল সার্ভার 2012 বা তার বেশি ব্যবহার করছেন না বা নিম্নলিখিত কারণে কাজ করে কোনও কারণে ফর্ম্যাট ফাংশন ব্যবহার করতে পারবেন না।
এছাড়াও, সংখ্যাটি 1 (উদাহরণস্বরূপ 0.01230000) এর চেয়ে কম হলে সমাধানগুলির অনেকগুলি কাজ করে না।
দয়া করে নোট করুন যে নিম্নলিখিতগুলি নেতিবাচক সংখ্যাগুলির সাথে কাজ করে না।
DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
যথাক্রমে 10.012345 এবং 0.012345 প্রদান করে।
এটা চেষ্টা কর:
select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
999999
আসবে, ওপি পিছনের জিরোগুলি সরিয়ে দিতে বলছে।
একটি ডেসিমাল (9,6) কলামটি নির্ভুলতার ক্ষতি ছাড়াই ফ্লোটে রূপান্তরিত হবে, সুতরাং ক্যাসেট (... এএস ফ্ল্যাট) কৌশলটি করবে।
@ এইচএলজিইএম: বলছেন যে নম্বরগুলি সংরক্ষণের জন্য ভাসা একটি দুর্বল পছন্দ এবং "কখনই ফ্লোট ব্যবহার করবেন না" সঠিক নয় - আপনাকে কেবল নিজের সংখ্যাগুলি জানতে হবে, উদাহরণস্বরূপ তাপমাত্রা পরিমাপটি ভাসা হিসাবে খুব ভাল হবে।
@ আবাতিষেভ এবং @ জাপাংস্কি: এসকিউএল সঞ্চিত প্রোকস এবং ফাংশনগুলির সামনে উপসর্গগুলি এখনও একটি ভাল ধারণা, যদি প্রয়োজন হয় না; আপনি যে লিঙ্কগুলি উল্লেখ করেছেন কেবলমাত্র সেগুলি সংরক্ষণ করা পদ্ধতিগুলির জন্য "sp_" উপসর্গটি ব্যবহার না করার নির্দেশ দেয় যা আপনার ব্যবহার করা উচিত নয়, অন্যান্য উপসর্গগুলি বেশ ভাল যেমন "usp_" বা "spb_"
তথ্যসূত্র: "6 বা তার চেয়ে কম দশমিক দশমিক সংখ্যা সহ সমস্ত পূর্ণসংখ্যা নির্ভুলতা না হারিয়ে একটি আইইইই 754 ফ্লোটিং-পয়েন্ট মানে রূপান্তর করা যেতে পারে": https://en.wikedia.org/wiki/Single-precision_floating-Point_format