2012-12-19 16 views
5

उपयोगकर्ताओं द्वारा बनाई गई कुछ त्रुटियों को ठीक करने के लिए, मुझे किसी एमएस एसक्यूएल सर्वर (2005 या 2008 कोई फर्क नहीं पड़ता) द्वारा होस्ट किए गए डेटाबेस में दशमलव बिंदु के बाद अंकों को गिनना होगा। मुझे ओरेकल डेटाबेस पर एक ही समस्या है, लेकिन चीजें कम जटिल हैं। निष्कर्ष ओरेकल चयन पर है:एमएस एसक्यूएल में फ्लोट कॉलम में दशमलव बिंदु के बाद अंकों की संख्या कैसे प्राप्त करें?

select length(substr(to_char(MY_FIELD), instr(to_char(MY_FILED),'.',1,1)+1, length(to_char(MY_FILED)))) as digits_length 
from MY_TABLE 

जहां दायर My_filed नाव (38) है। और

select LEN(SUBSTRING(CAST(MY_FIELD AS VARCHAR), CHARINDEX('.',CAST(MY_FILED AS VARCHAR),1)+1, LEN(CAST(MY_FIELD AS VARCHAR)))) as digits_length 
from MY_TABLE 

समस्या यह है कि एमएस SQL ​​सर्वर पर, जब मैं नाव संख्या varchar के रूप में MY_FIELD डाली केवल 2 दशमलव ने काट दिया गया है अंकों की गिनती:

सुश्री SQL सर्वर पर मैं उपयोग करने का प्रयास गलत है। क्या कोई मुझे कोई संकेत दे सकता है?

सर्वश्रेष्ठ संबंध।

उत्तर

5

मुझे अपने दोस्त से एक बहुत ही सरल समाधान मिला है जो कि बहुत अच्छा है। तो मैं दूसरों के समान स्थिति में दूसरों की सहायता के लिए वर्कअराउंड पोस्ट करूंगा।

पहले, बनाने के कार्य:

create FUNCTION dbo.countDigits(@A float) RETURNS tinyint AS 
BEGIN 
declare @R tinyint 
IF @A IS NULL 
    RETURN NULL 
set @R = 0 
while @A - str(@A, 18 + @R, @r) <> 0 
begin 
    SET @R = @R + 1 
end 
RETURN @R 
END 
GO 

दूसरा:

select MY_FIELD, 
dbo.countDigits(MY_FIELD) 
from MY_TABLE 

समारोह का उपयोग करके आप दशमलव बिंदु के बाद अंकों की सही संख्या मिल जाएगा।

0

पहली बात CAST के बजाय CONVERT का उपयोग करने के लिए स्विच करना है। अंतर CONVERT के साथ है, आप एक प्रारूप कोड निर्दिष्ट कर सकते हैं। CAST जो भी डिफ़ॉल्ट प्रारूप कोड का उपयोग करता है:

जब अभिव्यक्ति फ्लोट या असली होती है, तो शैली निम्न तालिका में दिखाए गए मानों में से एक हो सकती है। अन्य मान 0

कोई भी प्रारूप विशेष रूप से आकर्षक नहीं है, लेकिन मुझे लगता है कि आपके लिए उपयोग करने के लिए सबसे अच्छा 2 होगा। तो यह होगा:

CONVERT(varchar(25),MY_FIELD,2) 

दुर्भाग्यवश, आपको वैज्ञानिक नोटेशन में मूल्य और हमेशा 16 अंकों के साथ मूल्य देगा। 1.23456789e+000। "असली" अंकों की संख्या प्राप्त करने के लिए, आपको इस नंबर को अलग करने की आवश्यकता है, दशमलव भाग में अंकों की संख्या का कार्य करें, और एक्सपोनेंट में प्रदान की गई संख्या से इसे ऑफ़सेट करें।


और, बेशक, के बारे में अंक बात करने के लिए जब जो एक परिभाषित द्विआधारी प्रतिनिधित्व है एक नंबर के साथ काम कर कोशिश कर के बारे में सामान्य चेतावनियां/चेतावनी डालें। किसी विशेष float के "अंक" की संख्या इस गणना के आधार पर भिन्न हो सकती है कि इसकी गणना कैसे की गई थी।

6
SELECT 
LEN(CAST(REVERSE(SUBSTRING(STR(MY_FIELD, 13, 11), CHARINDEX('.', STR(MY_FIELD, 13, 11)) + 1, 20)) AS decimal)) 
from TABLE 
+0

बस ध्यान दें कि पूरी संख्या के लिए यह अपेक्षित 0 की बजाय 1 लौटाता है। – user824276

0

मुझे गति के बारे में निश्चित नहीं है। आदि या इस कोड के लालित्य। यह पहला दशमलव मान खोजने के लिए कुछ विज्ञापन-परीक्षण परीक्षण के लिए था।लेकिन इस कोड को सभी दशमलव के माध्यम से लूप में बदला जा सकता है और आखिरी बार एक मान आसानी से शून्य से अधिक था।

DECLARE @NoOfDecimals  int    = 0 
Declare @ROUNDINGPRECISION numeric(32,16) = -.00001000 

select @ROUNDINGPRECISION = ABS(@ROUNDINGPRECISION) 
select @ROUNDINGPRECISION = @ROUNDINGPRECISION - floor(@ROUNDINGPRECISION) 


while @ROUNDINGPRECISION < 1 
Begin 
    select @NoOfDecimals = @NoOfDecimals +1 
    select @ROUNDINGPRECISION = @ROUNDINGPRECISION * 10 

end; 

select @NoOfDecimals 
संबंधित मुद्दे