Sybase (टी-एसक्यूएल) में वर्कर दिनांक सत्यापन के लिए सबसे अच्छी विधि?

मेरे पास एक संग्रहीत प्रक्रिया है जो इसके पैरामीटर को varchar के रूप में लेती है जिसे बाद में उपयोग के लिए डेटाटाइम के रूप में डालने की आवश्यकता होती है:

SET @the_date = CAST(@date_string AS DATETIME)

मैं "डीडी-मॉन-वाईवायवाई" प्रारूप में दिनांक स्ट्रिंग की आपूर्ति करने की उम्मीद कर रहा हूं, लेकिन रक्षात्मक रूप से कोड करने के प्रयास में, अगर किसी कारण से इसे सफलतापूर्वक नहीं डाला जा सकता है, तो मैं सिस्टम की तारीख को डिफ़ॉल्ट करना चाहता हूं और जारी रहना। पीएल/एसक्यूएल में मैं इसे प्राप्त करने के लिए अपवाद हैंडलिंग का उपयोग कर सकता हूं और मैं नियमित अभिव्यक्तियों के साथ यह काफी आसानी से कर सकता हूं, लेकिन साइबेस द्वारा बॉक्स से समर्थित सीमित पैटर्न मिलान मुझे ऐसा करने नहीं देता है और मैं भरोसा नहीं कर सकता तीसरे पक्ष के पुस्तकालयों या एक्सटेंशन। क्या टी-एसक्यूएल में ऐसा करने का कोई आसान तरीका है?

एनबी: Sybase एएसई 12.5.3 का उपयोग कर, कोई ISDATE फ़ंक्शन नहीं है

0
ro fr bn

7 उत्तर

मिला "वैध दिनांक स्ट्रिंग एसक्यूएल" की खोज करते समय Google में यह दूसरा परिणाम ।

----Invalid date
SELECT ISDATE('30/2/2007')
RETURNS : 0 (Zero)
----Valid date
SELECT ISDATE('12/12/20007')
RETURNS : 1 (ONE)
----Invalid DataType
SELECT ISDATE('SQL')
RETURNS : 0 (Zero)
0
जोड़ा
इस तथ्य के बाद आपने जो कुछ जोड़ा है उसके लिए मुझे नीचे वोट करने के लिए कैसे जा रहे हैं। और जब मैंने सवाल का जवाब दिया। आपके पास एकमात्र पहचानकर्ता टी-एसक्यूएल था, जिसे माइक्रोसॉफ्ट एसक्यूएल सर्वर में सबसे ज्यादा इस्तेमाल किया जाता है, जो आईएसडीएटी का समर्थन करता है। बुरा शिष्टाचार
जोड़ा लेखक Nick Berardi, स्रोत
वैसे इसका उद्देश्य पोस्ट की गई पोस्ट का जवाब देना है। मैंने वह किया। और फिर आपने इसे बदल दिया। मेरी गलती नहीं।
जोड़ा लेखक Nick Berardi, स्रोत
IsDate Sybase में एक वैध कार्य नहीं है
जोड़ा लेखक ninesided, स्रोत
मैंने सोचा था कि मतदान का उद्देश्य एक ऐसे उत्तर को इंगित करना था जिसने मदद नहीं की, जवाब देने में मदद की जो शीर्ष पर पहुंचने में मदद की, यह मामूली के रूप में नहीं था
जोड़ा लेखक ninesided, स्रोत
जब तक आप पोस्ट संपादित नहीं करते हैं तब तक इसे रद्द नहीं कर सकते हैं
जोड़ा लेखक ninesided, स्रोत

सुनिश्चित करें कि SQL सर्वर निष्पादित करके आपकी स्ट्रिंग में दिन, महीनों और वर्षों का आदेश जानता है

SET DATEFORMAT mdy;
0
जोड़ा
मैं डेट पार्ट्स के ऑर्डर करने के बारे में बहुत चिंतित नहीं हूं, डेट स्ट्रिंग की वैधता के बारे में और अधिक। यानी मैं इसे '32 -DEC-200 9 'में पास होने पर विस्फोट नहीं करना चाहता, मैं इसे वर्तमान सिस्टम दिनांक में डिफ़ॉल्ट करना चाहता हूं।
जोड़ा लेखक ninesided, स्रोत

मेरी भलाई, अगर सवाल माइक्रोसॉफ्ट एसक्यूएल सर्वर के बारे में था तो हम व्यवसाय में होते!

साइबेस, दुख की बात है, इन दिनों एक संपूर्ण 'नोटर डेटाबेस है, लगभग 1 99 7 से, वास्तव में, एक वर्ष दें या लें।

यदि इनपुट प्रारूप को केवल 'डीडी-मॉन-वाईवायवाई' होना चाहिए और कोई अपवाद नहीं है, तो मुझे लगता है कि कुछ सरल चीजें करने के बाद, कुछ लंबाई की जांच करने के बाद, SUBSTR() का उपयोग करके इनपुट को स्लाइस करके उचित मात्रा में सत्यापन प्राप्त किया गया था। ।

मैंने सोचा कि सिबेज की हालिया रिलीज (उदाहरण के लिए एसक्यूएल कहीं भी 11), नियमित अभिव्यक्ति समर्थन है, हालांकि, यह थोड़ी देर के बाद से मुझे टी-एसक्यूएल भुगतना पड़ा है। कुछ googling मुझे और अधिक संदेह में छोड़ देता है।

0
जोड़ा

क्या आपने cast के बजाय convert को आजमाया था?

select convert( datetime , @date_string ) 
0
जोड़ा
हां, कन्वर्ट का उपयोग करने से कोई फर्क नहीं पड़ता
जोड़ा लेखक ninesided, स्रोत

ऐसा लगता है कि आप खुद को घुमाएंगे।

You could probably use this as a starting point.

0
जोड़ा

मुझे एक समान समस्या है। आप ऐसा कुछ करने में सक्षम हो सकते हैं:

SET arithabort arith_overflow off
SET @the_date = CAST(@date_string AS DATETIME)
IF @the_date is NULL
    set @the_date = getdate()
SET arithabort arith_overflow on

हालांकि, यह एक चयन में अच्छी तरह से काम नहीं करता है। यह कर्सर (बू) या एसक्यूएल बैच के पहले/बाद में तर्क में अच्छी तरह से काम करेगा।

0
जोड़ा
यह मेरी ज़रूरतों के लिए काफी अच्छा काम करता है, धन्यवाद!
जोड़ा लेखक ninesided, स्रोत

क्या आप ऐसा कुछ नहीं कर सकते:

SELECT @the_date = CASE @date_string
                      WHEN '[0-9][0-9]-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]'
                      THEN CONVERT(datetime, @date_string)
                      ELSE GETDATE()
                   END

?

0
जोड़ा
यह सुनिश्चित नहीं करेगा कि जो भी आप प्राप्त कर रहे हैं वह वैध तिथि है, हालांकि, मैं फ़ंक्शन में 99-एएए-99 99 पास कर सकता हूं और यह इस सरल जांच को पास करेगा। आप इसे एक बड़े केस स्टेटमेंट के साथ अधिक परिष्कृत बना सकते हैं, लेकिन जब आप लीप वर्षों के बारे में सोचना शुरू करते हैं और कौन सा महीनों में 30/31 दिन होते हैं तो यह मुश्किल हो जाता है।
जोड़ा लेखक ninesided, स्रोत
सहमत है, यह केवल सरल प्रमाणीकरण है, असली IsDate() नहीं, यदि यह आपको उपयुक्त बनाता है, तो आप आपूर्ति किए गए टेक्स्ट को डेटाटाइम में कनवर्ट करने का प्रयास कर सकते हैं, और जांच सकते हैं, यदि कनवर्ट @@ त्रुटि चर की जांच करके सफल हुआ, लेकिन जैसा कि मैंने कहा, यह आधा है -उपाय। खुश होती है।
जोड़ा लेखक B0rG, स्रोत