आपको बेहतर तरीके से अपनी तिथियों को DATETIME
. के रूप में संगृहीत करना चाहिए . जैसा कि आपके पास ये मान हैं, यह पहले से ही दिखाता है कि आपके डेटाबेस फ़ील्ड date
के नहीं हैं टाइप करें, जैसे स्ट्रिंग्स को date
. में इन्सर्ट करना फ़ील्ड त्रुटि उत्पन्न नहीं करेंगे।
यदि इसे बदलना संभव नहीं है, तो आप STR_TO_DATE
. का उपयोग कर सकते हैं समारोह:
SELECT *
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
लेकिन यह वास्तव में एक घटिया समाधान है।
फिर भी, केवल एक पंक्ति प्राप्त करने की आपकी अपेक्षा अजीब लगती है। निश्चित रूप से तीसरी पंक्ति आवश्यकता को पूरा करती है, क्योंकि प्रारंभ/देय तिथियां उस तिथि से पहले/बाद की हैं, जिसकी आप जांच कर रहे हैं, चाहे समय का कुछ भी हिस्सा क्यों न हो।
परिशिष्ट
टिप्पणियों में आप कह रहे हैं कि आप एक अलग तर्क लागू करना चाहते हैं। मैं अनुमान कर रहा हूँ आप अलग-अलग दिनांक और समय घटकों की तुलना करना चाहते हैं, और दोनों between
. का अनुपालन करना चाहते हैं स्थिति। यह वास्तव में प्रश्न में समझाया जाना चाहिए, क्योंकि वर्तमान में यह निर्दिष्ट नहीं है।
उस स्थिति में, आप DATE_FORMAT
. का उपयोग कर सकते हैं केवल समय भाग निकालने के लिए, और उसके साथ शर्त को दोहराएं:
SELECT *,
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p')
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
AND DATE_FORMAT(STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p'), '%h:%i') BETWEEN
DATE_FORMAT(STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'), '%h:%i') AND
DATE_FORMAT(STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'), '%h:%i')
यह क्वेरी परिणाम से 3 पंक्ति को बाहर कर देगी।