WHERE
क्लॉज गलत है, इसे टेबल रेफरेंस और जॉइन ऑपरेशंस का पालन करना होगा।
कुछ इस तरह:
FROM tartikel p1
JOIN tartikelpict p2
ON p1.kArtikel = p2.kArtikel
AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC
संपादित करें (तीन प्लस साल बाद)
उपरोक्त अनिवार्य रूप से प्रश्न का उत्तर देता है "मैंने अपनी क्वेरी में WHERE क्लॉज जोड़ने का प्रयास किया और अब क्वेरी एक त्रुटि लौटा रही है, मैं इसे कैसे ठीक करूं?"
"पिछले 7 दिनों" की तिथि सीमा की जांच करने वाली शर्त लिखने के बारे में एक प्रश्न के रूप में...
यह वास्तव में विनिर्देश की व्याख्या करने पर निर्भर करता है कि तालिका में कॉलम का डेटाटाइप क्या है (DATE या DATETIME) और कौन सा डेटा उपलब्ध है ... क्या लौटाया जाना चाहिए।
संक्षेप में:सामान्य दृष्टिकोण दिनांक/डेटाटाइम सीमा के लिए "प्रारंभ" और उस सीमा के "समाप्ति" की पहचान करना है, और उन्हें एक क्वेरी में संदर्भित करना है। आइए कुछ आसान पर विचार करें... "कल" के लिए सभी पंक्तियाँ।
अगर हमारा कॉलम DATE टाइप का है। किसी क्वेरी में एक्सप्रेशन शामिल करने से पहले, हम इसे एक साधारण SELECT
. में टेस्ट कर सकते हैं SELECT DATE(NOW()) + INTERVAL -1 DAY
और सत्यापित करें कि लौटाया गया परिणाम वही है जिसकी हम अपेक्षा करते हैं। फिर हम उसी अभिव्यक्ति का उपयोग WHERE क्लॉज में कर सकते हैं, इसकी तुलना DATE कॉलम से इस तरह कर सकते हैं:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
DATETIME या TIMESTAMP कॉलम के लिए, हम >=
. का उपयोग कर सकते हैं और <
एक श्रेणी निर्दिष्ट करने के लिए असमानता की तुलना
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
"पिछले 7 दिनों" के लिए हमें यह जानना होगा कि क्या इसका मतलब अभी इस बिंदु से है, 7 दिन पहले ... उदा। पिछले 7*24 घंटे, तुलना में समय घटक सहित, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
पिछले सात पूरे दिन, आज को शामिल नहीं करते
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
या पिछले छह पूर्ण दिन प्लस आज तक ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
मैं एक सेलेक्ट स्टेटमेंट में दाईं ओर के भावों का परीक्षण करने की सलाह देता हूं, हम परीक्षण के लिए नाउ () के स्थान पर एक उपयोगकर्ता द्वारा परिभाषित चर का उपयोग कर सकते हैं, जो अब () रिटर्न से बंधे नहीं हैं, इसलिए हम सप्ताह/महीने में सीमाओं का परीक्षण कर सकते हैं /वर्ष की सीमाएं, और इसी तरह।
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
एक बार जब हमारे पास ऐसे भाव होते हैं जो हमारे विशेष उपयोग के मामले में "प्रारंभ" और "अंत" के लिए काम करते हैं, तो "पिछले 7 दिनों" से हमारा क्या मतलब है, हम उन अभिव्यक्तियों का उपयोग WHERE खंड में श्रेणी तुलना में कर सकते हैं।
(कुछ डेवलपर DATE_ADD
का उपयोग करना पसंद करते हैं और DATE_SUB
+ INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
के स्थान पर कार्य करता है वाक्य रचना।
और MySQL DATE, DATETIME और TIMESTAMP डेटाटाइप के साथ काम करने के लिए कुछ सुविधाजनक कार्य प्रदान करता है... DATE, LAST_DAY,
कुछ डेवलपर्स अन्य कोड में प्रारंभ और अंत की गणना करना पसंद करते हैं, और SQL क्वेरी में स्ट्रिंग अक्षर की आपूर्ति करते हैं, जैसे कि डेटाबेस को सबमिट की गई क्वेरी
है WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
और वह तरीका भी काम करता है। (मेरी प्राथमिकता स्पष्ट रूप से उन स्ट्रिंग अक्षर को DATETIME में डालना होगा, या तो CAST, CONVERT या केवल + INTERVAL ट्रिक के साथ...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
उपरोक्त सभी मानते हैं कि हम "तिथियां" उचित DATE, DATETIME और/या TIMESTAMP डेटाटाइप में संग्रहीत कर रहे हैं, और उन्हें विभिन्न स्वरूपों में स्ट्रिंग के रूप में संग्रहीत नहीं कर रहे हैं उदा। 'dd/mm/yyyy'
, m/d/yyyy
, जूलियन तिथियां, या छिटपुट रूप से गैर-विहित प्रारूपों में, या युग की शुरुआत के बाद से कई सेकंड के रूप में, इस उत्तर को अधिक लंबा होने की आवश्यकता होगी।