मेरे पास एक कॉलम है DECIMAL(9,6)
यानी यह 999,123456 जैसे मूल्यों का समर्थन करता है।
लेकिन जब मैं 123,4567 जैसा डेटा डालता हूं तो यह 123,456700 हो जाता है
उन शून्य को कैसे हटाएं?
मेरे पास एक कॉलम है DECIMAL(9,6)
यानी यह 999,123456 जैसे मूल्यों का समर्थन करता है।
लेकिन जब मैं 123,4567 जैसा डेटा डालता हूं तो यह 123,456700 हो जाता है
उन शून्य को कैसे हटाएं?
जवाबों:
एक decimal(9,6)
स्टोर अल्पविराम के दाईं ओर 6 अंक। अनुगामी शून्य प्रदर्शित करना है या नहीं, यह एक प्रारूपण निर्णय है, जिसे आमतौर पर ग्राहक पक्ष पर लागू किया जाता है।
लेकिन SSMS प्रारूपों के बाद से float
शून्य अनुगामी बिना, आप कास्टिंग द्वारा शून्य अनुगामी निकाल सकते हैं decimal
एक करने के लिए float
:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
प्रिंट:
123.456700 123,4567
(मेरा दशमलव विभाजक एक अल्पविराम है, फिर भी एसएसएमएस एक डॉट के साथ दशमलव को प्रारूपित करता है। जाहिर तौर पर एक ज्ञात मुद्दा है ।)
आप FORMAT()
फ़ंक्शन (SqlAzure और Sql Server 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'
FLOAT (या REAL) का उपयोग करते समय सावधान रहें: g17
( g8
REAL के साथ बड़ा या (या बड़ा ) का उपयोग न करें , क्योंकि मशीन प्रतिनिधित्व की सीमित परिशुद्धता अवांछित प्रभाव का कारण बनती है:
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'
इसके अलावा, ध्यान दें कि, प्रलेखन के अनुसार :
FORMAT .NET फ्रेमवर्क सामान्य भाषा रनटाइम (CLR) की उपस्थिति पर निर्भर करता है। इस कार्य को निरस्त नहीं किया जाएगा क्योंकि यह सीएलआर की उपस्थिति पर निर्भर करता है। एक फ़ंक्शन को रीमोट करना जिसमें CLR की आवश्यकता होती है, दूरस्थ सर्वर पर त्रुटि का कारण होगा।
SqlAzure में भी काम करता है।
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
मैं अपने दशमलव में होने के लिए अधिक अंकों की क्षमता के कारण फ्लोट करने के लिए अनिच्छुक था जो फ्लोट का प्रतिनिधित्व कर सकता है
FORMAT
जब एक मानक .net प्रारूप स्ट्रिंग 'g8' के साथ प्रयोग किया जाता है तो बहुत छोटे दशमलव के मामलों में वैज्ञानिक संकेतन लौटा (उदाहरण 1e-08) जो अनुपयुक्त भी था
एक कस्टम प्रारूप स्ट्रिंग ( https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings ) का उपयोग करके मुझे वह हासिल करने की अनुमति मिली जो मैं चाहता था:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
यदि आप चाहते हैं कि आपकी संख्या कम से कम एक अनुगामी शून्य हो, तो 2.0 2 नहीं बनती है, जैसे प्रारूप स्ट्रिंग का उपयोग करें 0.0#####
दशमलव बिंदु स्थानीयकृत है, इसलिए संस्कृतियां जो दशमलव विभाजक के रूप में अल्पविराम का उपयोग करती हैं, जहां अल्पविराम का उत्पादन होगा। है
बेशक, यह डेटा लेयर को फॉर्मेट करने (लेकिन मेरे मामले में कोई अन्य लेयर नहीं है) के लिए हतोत्साहित करने वाला अभ्यास है; उपयोगकर्ता सचमुच एक संग्रहीत कार्यविधि चला रहा है और परिणाम को ईमेल में डाल रहा है: /)
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')
परिणाम दर्दनाक है, मुझे पता है, लेकिन मैं वहां गया था, ऊपर दिए गए उत्तरों से बहुत मदद मिली।
परिशुद्धता के नुकसान की संभावना के कारण परिवर्तित करने से पहले FLOAT या MONEY में सबसे अच्छा तरीका परिवर्तित नहीं है । तो सुरक्षित तरीके कुछ इस तरह हो सकते हैं:
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
जहाँ @value किसी भी दशमलव (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')
, '.', ' ')), ' ', '.')
बीच की रेखा अनुगामी रिक्त स्थान को स्ट्रिप्स करती है, बाहरी दो बिंदु हटाते हैं यदि कोई दशमलव अंक नहीं हैं
मुझे अपने डेसीमल पर ट्रेलिंग जीरो को हटाने की आवश्यकता थी ताकि मैं केवल एक अग्रणी शून्य के साथ एक निश्चित लंबाई के तार का उत्पादन कर सकूं।
(उदाहरण के लिए मुझे १४ अक्षरों का उत्पादन करने की आवश्यकता थी ताकि १४२.०२३४०० ०० output१४23२३२४४ बन जाएगा)
मैंने प्रयोग किया parsename
, reverse
और cast
as int
पीछे चल रहे शून्य को हटाने के लिए:
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(तब अपने अग्रणी शून्य को प्राप्त करने के लिए मैं ऊपर की लंबाई के आधार पर शून्य की सही संख्या की प्रतिकृति बना सकता हूं और इसे ऊपर के सामने से हटा सकता हूं)
मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।
TSQL में अग्रणी और अनुगामी शून्य को निकालना संभव है
यदि स्ट्रिंग नहीं है, तो STR TSQL फ़ंक्शन का उपयोग करके इसे स्ट्रिंग में कनवर्ट करें
अग्रणी और अनुगामी शून्य को निकालें
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
मंच पर अधिक जानकारी ।
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
इस बारे में कैसा है? आपके फ़ंक्शन में आने वाले डेटा को @thisData मानकर:
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)
सबसे आसान तरीका है कि मूल्य को FLOAT के रूप में और फिर एक स्ट्रिंग डेटा प्रकार के लिए।
CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))
इसे इस्तेमाल करे:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
मुझे पता है कि यह धागा बहुत पुराना है, लेकिन SQL सर्वर 2012 या इसके बाद के संस्करण का उपयोग नहीं करने वाले या किसी भी कारण से FORMAT फ़ंक्शन का उपयोग नहीं कर सकते हैं तो निम्न कार्य करता है।
इसके अलावा, यदि संख्या 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 रिटर्न देता है।
एक DECIMAL (9,6) कॉलम बिना किसी नुकसान के फ्लोट में बदल जाएगा, इसलिए CAST (... AS फ्लोट) ट्रिक करेगा।
@ एचएलजीईएम: यह कहना कि फ्लोट संख्याओं के लिए एक खराब विकल्प है और "कभी भी फ्लोट का उपयोग न करें" सही नहीं है - आपको बस अपनी संख्याओं को जानना होगा, उदाहरण के लिए तापमान माप फ्लोट के रूप में अच्छी तरह से जाना होगा।
@abatishchev और @japongskie: SQL संग्रहित प्रोक्स और फ़ंक्शंस के सामने उपसर्ग अभी भी एक अच्छा विचार है, यदि आवश्यक नहीं है; आपके द्वारा बताए गए लिंक केवल संग्रहीत प्रक्रियाओं के लिए "sp_" उपसर्ग का उपयोग नहीं करने का निर्देश देते हैं, जिसे आपको उपयोग नहीं करना चाहिए, अन्य उपसर्ग ठीक हैं जैसे "usp_" या "spbus_"
संदर्भ: "6 या उससे कम महत्वपूर्ण दशमलव अंकों वाले सभी पूर्णांकों को परिशुद्धता के नुकसान के बिना IEEE 754 फ़्लोटिंग-पॉइंट मान में परिवर्तित किया जा सकता है": https://en.wikipedia.org/wiki/Single-prepy_floating-point-format ...