2009-03-11 13 views
6

यह चयन बयान मुझे गणित त्रुटि संदेश देता है: एक ओर जहां यह एक काम करता हैअंकगणित अतिप्रवाह त्रुटि डेटा प्रकार datetime को अभिव्यक्ति परिवर्तित

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate > '2008-12-31' 

:

SELECT CAST(FLOOR((CAST(LeftDate AS DECIMAL(12,5)))) AS DATETIME), LeftDate 
FROM Table 
WHERE LeftDate < '2008-12-31' 

वहाँ कुछ डेटा के साथ गलत हो सकता है (मैंने शून्य मानों की जांच की है, और कोई नहीं है)?

उत्तर

9

यह समस्या तब हुई जब 99 99-12-31 पर एक तिथि निर्धारित की गई थी, शायद दशमलव को संभालने के लिए बड़ी संख्या में। दशमलव से फ्लोट में बदल दिया गया है, और हर चीज एक आकर्षण की तरह काम कर रही है।

7

सामान्य रूप से, किसी तारीख को संख्यात्मक या स्ट्रिंग में कनवर्ट करना, उस पर दिनांक संचालन करने के लिए, अत्यधिक अक्षम है। (रूपांतरण अपेक्षाकृत गहन हैं, जैसे स्ट्रिंग मैनिप्लेशंस हैं।) केवल तारीख कार्यों के साथ रहना बेहतर है।

उदाहरण आप दे (मेरा मानना ​​है कि) की दूरी पर दिनांक समय के समय भाग पट्टी, निम्नलिखित रूपांतरणों की भूमि के ऊपर के बिना करता है कि ...

DATEADD(DAY, DATEDIFF(DAY, 0, <mydate>), 0) 

यह भी arithmentic अतिप्रवाह से बचना चाहिए है ..

+3

ऐसा करने का एकमात्र तरीका ... – gbn

+0

@gbn लेकिन यह यह 'डेटीफ (एमएस, '1 9 70-01-01', getdate()) नहीं करेगा। – Saulius

+0

धन्यवाद @MatBailie यह मेरी समस्या तय! सीएएसटी का उपयोग करके मुझे "अंकगणित ओवरफ्लो त्रुटि अभिव्यक्ति को डेटा प्रकार डेटाटाइम में परिवर्तित करने" त्रुटि दे रही थी –

संबंधित मुद्दे