मेरे पास एक क्वेरी है जिसमें मुख्य क्वेरी के शीर्ष पर उपयोगकर्ता द्वारा परिभाषित चर सेट है। यह कुछ इस प्रकार है।

set @from_date = '2019-10-01', @end_date = '2019-12-31';
SELECT * FROM myTable
WHERE create_time between @from_date AND @end_date;

जब मैं इसे MySQL वर्कबेंच में निष्पादित करता हूं तो यह ठीक काम करता है, लेकिन जब मैं इसे MySQL ODBC के माध्यम से एक्सेल में डालता हूं तो यह हमेशा इस तरह की त्रुटि दिखाता है।

enter image description here

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

0
Hilman Dhannysworo 27 पद 2019, 10:39

2 जवाब

सबसे बढ़िया उत्तर

ODBC कनेक्टर सबसे अधिक संभावना है कि कथनों या तैयार कथनों के माध्यम से MySQL के साथ संचार कर रहा है, एक समय में एक कथन, और उपयोगकर्ता चर समर्थित नहीं हैं। एक तैयार बयान एक तरीका होगा जिससे आप अपनी तिथि अक्षर को बांध सकते हैं। यहां एक और विकल्प, आपका उदाहरण दिया गया है, केवल दिनांक अक्षर को इनलाइन करना होगा:

SELECT *
FROM myTable
WHERE create_time >= '2019-10-01' AND create_time < '2020-01-01';

साइड नोट: मैंने create_time पर चेक व्यक्त किया, जो असमानता का उपयोग करते हुए 2019 की अंतिम तिमाही को शामिल करना चाहता है। इसका कारण यह है कि यदि create_time टाइमस्टैम्प/डेटटाइम हो, तो RHS पर BETWEEN के साथ 31-दिसंबर का उपयोग करने पर केवल उस दिन को आधी रात को शामिल किया जाएगा, इसके बाद कभी भी नहीं।

2
Tim Biegeleisen 27 पद 2019, 07:44

चर मानों init के लिए सबक्वेरी का उपयोग करें:

SELECT * 
FROM myTable,
     ( SELECT @from_date := '2019-10-01', @end_date := '2019-12-31' ) init_vars
WHERE create_time between @from_date AND @end_date;

ध्यान दें:

  1. SELECT का उपयोग किया जाता है, SET का नहीं;
  2. सहायक ऑपरेटर := का उपयोग किया जाता है, = ऑपरेटर को गलत परिणाम देने वाले इस मामले में एक की तुलना करने वाला माना जाएगा;
  3. उपनाम (init_vars) कोई भी हो सकता है, लेकिन यह अनिवार्य है।

वैरिएबल को एक बार इनिशियलाइज़ किया जाता है लेकिन कई बार इस्तेमाल किया जा सकता है।

यदि आपकी क्वेरी जटिल (नेस्टेड) ​​है, तो वेरिएबल को सबसे आंतरिक सबक्वेरी में प्रारंभ किया जाना चाहिए। या पहले सीटीई में यदि डीबीएमएस संस्करण सीटीई के बारे में जानता है। यदि क्वेरी अत्यंत जटिल है, और आप यह निर्धारित नहीं कर सकते हैं कि कौन सी सबक्वेरी "सबसे आंतरिक" है, तो पहले किस तालिका को स्कैन किया गया है, इसके लिए निष्पादन योजना देखें, और चर के लिए इसकी सबक्वायरी का उपयोग करें init (लेकिन याद रखें कि निष्पादन योजना को किसी में भी बदला जा सकता है। पल)।

1
Akina 27 पद 2019, 08:18