2013-04-16 10 views
6

में दिनांकों की तुलना करने के लिए सामान्य एसक्यूएल मुझे अपनी क्वेरी में दिनांक तुलना शामिल करने की आवश्यकता है जहां मैं DATETIME कॉलम पर दिनांक स्ट्रिंग की तुलना करता हूं लेकिन मुझे इसे ORACLE और SQL सर्वर दोनों पर काम करने की आवश्यकता है और दो अलग नहीं हैं प्रश्नों। क्या कोई तारीख तुलना है जो ऑरैकल और एसक्यूएल दोनों पर काम करेगी?SQL सर्वर और ORACLE

ऑरेकल:

Select * from MyTable where myDate > DATE '2013-04-10' 

एसक्यूएल सर्वर:

Select * from MyTable where myDate > convert(DATETIME,'2013-04-10', 126) 
+0

@Aaron Bertrand कोई उपरोक्त में काम नहीं करता है। यह त्रुटियों का कहना है कि यह एक अवैध महीना है। – CathalMF

+0

@ कैथलएमएफ जो [आपकी एनएलएस सेटिंग्स पर निर्भर करता है] (http://www.sqlfiddle.com/#!4/d41d8/9820) जैसा कि एड द्वारा उल्लिखित है। –

+0

@ जैकडॉगस - आप सही हैं; मैंने वहां बिंदु को बढ़ा दिया। मुझे "गन्दा" या "जोखिम भरा" कहा जाना चाहिए था और उस पर छोड़ दिया था। मैं टिप्पणी संपादित करूंगा। –

उत्तर

5

यह पोर्टेबिलिटी समस्या केवल शाब्दिक साथ लागू होता है।

मुझे विश्वास नहीं है कि ऐसा करने का एक पूर्ण पोर्टेबल तरीका है क्योंकि SQL सर्वर एएनएसआई शाब्दिक DATE कीवर्ड का समर्थन नहीं करता है और सभी CAST, CONVERT, TO_DATE, और दिनांक फ़ंक्शंस सभी प्लेटफ़ॉर्म पर समान नहीं हैं।

ध्यान दें कि आपकी दूसरी क्वेरी को Select * from MyTable where myDate > '20130410' के रूप में भी लिखा जा सकता है।

यह अच्छा होगा अगर ANSI DATE शाब्दिक सुविधा (डीबी/2 और टेराडाटा दोनों के लिए SQL सर्वर में समर्थन था) अच्छा होगा।

मुझे इस पर एक कनेक्ट आइटम नहीं मिला, और न ही SQL सर्वर ANSI DATE, TIME और TIMESTAMP शाब्दिक कीवर्ड का समर्थन क्यों नहीं करता है।

मैं आपके परिदृश्य में सोच रहा हूं, क्या इसके बजाय पैरामीटर का उपयोग करना संभव होगा?

जैक की टिप्पणी Common SQL to compare dates in SQL Server and ORACLE में समाधान इस कोड को पोर्टेबल बना देगा, लेकिन आपको एक गैर-पोर्टेबल स्केलर फ़ंक्शन होना होगा। यह आपके लिए एक व्यवहार्य विकल्प हो सकता है - ध्यान दें कि SQL सर्वर में, आपको स्केलर फ़ंक्शन को अपनी स्कीमा के साथ उपसर्ग करना होगा - यह ओरेकल कोड और एसक्यूएल कोड के बीच एक और झुर्रियां पेश कर सकता है यदि आप स्कीमा को एक ही नाम नहीं बना सकते (ओरेकल में नोट करें, यदि आप फ़ंक्शन के अंदर फ़ंक्शन डालते हैं तो उपसर्ग स्कीमा के बजाय पैकेज का नाम हो सकता है)

1

क्या आपके अपने उपयोगकर्ता द्वारा परिभाषित फ़ंक्शंस को परिभाषित किया गया है? आप एक ऐसा कार्य बना सकते हैं जो डीबीएमएस विशिष्ट कोड को सारणीबद्ध करता है और एक शाब्दिक 'सही' या 'गलत' परिणाम देता है।

[MSSQL उपयोगकर्ता निर्धारित कार्य:] http://msdn.microsoft.com/en-ca/library/ms186755.aspx

[ओरेकल उपयोगकर्ता निर्धारित कार्य] http://ocs.oracle.com/cd/B19306_01/server.102/b14200

ओरेकल जाहिरा तौर पर उपयोगकर्ता परिभाषित कार्यों एक बूलियन वापस जाने के लिए अनुमति नहीं है, इसलिए एक स्ट्रिंग (या न्यूमेरिक) परिणाम है की आवश्यकता है।

+1

क्यों न केवल एक फ़ंक्शन बनाएं जो स्ट्रिंग लेता है और एक तिथि देता है? –

+0

क्योंकि वह एक पंक्ति पर आवेदन करने के लिए एक परीक्षण के लिए पूछ रहा है। – marceljg

+4

'MyTable से चुनें * जहां myDate> give_me_the_date (' 2013-04-10 ') ' –