मेरे पास एक सहयोगी द्वारा लिखित एक SQL क्वेरी है जो अब यहां नहीं है। क्वेरी एक SSIS काम का हिस्सा के रूप में चलाता है, और इस महीने के रूप में निम्नलिखित त्रुटि के साथ विफल शुरू कर दिया है:एसक्यूएल - तिथि प्रश्न समस्या - डेटाटाइम रूपांतरण के लिए वर्चर के परिणामस्वरूप ऑफ-ऑफ-रेंज वैल्यू
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
क्वेरी के साथ ही चयन सिर्फ एक बुनियादी है एक जहां खंड है कि एक निश्चित समय में मूल्यों के लिए लग रहा है रेंज (@startdate
और @enddate
के बीच तिथि सीमा)
समय सीमा निर्धारित करने के लिए कोड के नीचे है:
DECLARE @RunDateTime datetime
DECLARE @RunDate datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Month int
DECLARE @Year int
DECLARE @strStartDate varchar(10)
SET @RunDateTime = GetDate()
SET @RunDate = cast(round(convert(real, @RunDateTime),0,1) as datetime)
IF DATEPART(d, @RunDate) = 16
BEGIN
SET @StartDate = DATEADD(d, -15, @RunDate)
SET @EndDate = @RunDate
END
ELSE
BEGIN
IF Month(@RunDate) = 1
SET @Month = 12
ELSE
SET @Month = Month(@RunDate) - 1
IF Month(@RunDate) = 1
SET @Year = Year(@RunDate) - 1
ELSE
SET @Year = Year(@RunDate)
SET @strStartDate = CONVERT(varchar(2), @Month)+ '/16/' + CONVERT(varchar(4), @Year)
SET @StartDate = CONVERT(datetime, @strStartDate, 101)
SET @EndDate = @RunDate
END
यह काम महीने में दो बार चलाता है। महीने के पहले से 15 वें महीने के आंकड़ों के लिए 16 वें स्थान पर, और 16 महीने से पिछले महीने के अंत तक डेटा के लिए अगले महीने के पहले महीने में।
मुझे जो ऑनलाइन मिल सकता है, varchar
का उपयोग strStartDate
के लिए संभावित अपराधी है? मैं एसक्यूएल के साथ पर्याप्त परिचित नहीं हूं कि यह जानने के लिए कि वहां क्या सामान बदल रहा है? साथ ही, क्या रन टाइम प्राप्त करने की तुलना में महीने की तारीख के अंत का निर्धारण करने का एक बेहतर तरीका है? किसी भी मदद की बहुत सराहना की जाएगी।
(पीएस, हम इस काम को SQL सर्वर 2008 आर 2 पर चलाते हैं) और मैंने डीबीए के साथ जांच की और उन्होंने कहा कि स्थानीयकरण या क्षेत्रीय सेटिंग्स के बारे में कुछ भी नहीं है जो SQL सर्वर पर बदल गया है।
ऐसा लगता है कि आप पिछले महीने के 16 वें की गणना करने की कोशिश कर रहे हैं। स्ट्रिंग मैनिपुलेशन करने के बजाय, 'SET @StartDate = DATEADD (महीना, DATEDIFF (महीना,' 20010101 ', @ रनडेट),' 20001216 ')', 'हमेशा इसे ढूंढना चाहिए (दो स्ट्रिंग स्थिरांक को ठीक उसी तरह रखें) । –
क्या आप वाकई कोड पोस्ट किए गए कोड के अनुभाग में हैं? लाइन कनवर्टर (डेटाटाइम, @स्ट्रस्टार्टडेट, 101) पर 101 इंगित करता है कि स्ट्रस्टार्टडेट एमएम/डीडी/वाईय प्रारूप में होना चाहिए, जो कि है, ताकि सर्वर की क्षेत्रीय सेटिंग्स पर निर्भर न हो। – sgmoore
@Damien_The_Unbeliever हाँ, यह क्वेरी हमेशा एक महीने के पहले और 16 वें स्थान पर चली जाएगी। यदि यह एक महीने के 16 वें स्थान पर नहीं चलता है, तो यह पहला होना चाहिए, इसलिए हम StartDate मान को पिछले महीने के 16 वें का प्रतिनिधित्व करना चाहते हैं। (हम मूल रूप से केवल पिछले महीने के # 16 प्राप्त करना चाहते हैं यदि क्वेरी 1 पर चलती है) मैं इतना एसक्यूएल साक्षर नहीं हूं, लेकिन क्या आपके द्वारा प्रदान किया गया कोड किसी भी महीने के लिए काम करता है? या बस दिसंबर के लिए करते हैं? – Oryx