मैं MySQL का उपयोग करके दो तिथियों के बीच कैसे क्वेरी कर सकता हूं?


225

निम्नलिखित प्रश्न:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

कुछ नहीं देता।

यद्यपि कार्य करने के लिए मेरे पास पर्याप्त डेटा से अधिक होना चाहिए। मैं क्या गलत कर रहा हूं?


32
BETWEEN के साथ सतर्क रहें, क्योंकि दोनों minऔर maxमानों को सीमा में माना जाता है, किसी भी तिथि को दो बार संसाधित नहीं करने के लिए minऔर maxमूल्य (एज केस)। उदाहरण के लिए, तारीख और के बीच2010-09-29 00:00:00 होगा , और ALSO के बीच और2010-09-28 00:00:002010-09-29 00:00:00 2010-09-29 00:00:002010-09-30 00:00:00
मिनिपिफ

हाँ, उसने क्या कहा ^ ^
अल्बर्ट रैनसेटेपर

जवाबों:


471

आपकी दूसरी तारीख आपकी पहली तारीख से पहले है (यानी आप 29 सितंबर 2010 से 30 जनवरी 2010 के बीच क्वेरी कर रहे हैं)। तिथियों के क्रम को उलटने का प्रयास करें:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

मुझे यह पता था लेकिन अब अद्यतन के साथ मुद्दा है। मैं UPDATE के लिए BETWEEN का उपयोग करने की कोशिश कर रहा हूं क्या इसे उसी तरह से काम करना चाहिए?
इनगस

3
@IngusGraholskis: एक whereखंड पर selectया updateबयानों पर समान काम करना चाहिए ।
T30

व्यक्तिगत रूप से, मुझे उस शब्द को याद रखने के लिए 'से' और 'से' एक डरपोक तरीका है, जिसमें क्वेरी लिखी जानी चाहिए।
केगनफॉच

यदि दोनों तिथियां शून्य या रिक्त हैं, तो सभी डेटा कैसे वापस करें?
कोडिंग की दुनिया

23

आपकी क्वेरी में तारीख होनी चाहिए

select * from table between `lowerdate` and `upperdate`

प्रयत्न

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

है date_fieldप्रकार के datetime? इसके अलावा आपको सबसे पहले ईयरलर की तारीख डालनी होगी।

यह होना चाहिए:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE () एक MySQL फ़ंक्शन है जो किसी दिनांक या दिनांक / समय की अभिव्यक्ति का केवल दिनांक भाग निकालता है

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

आप एक स्पष्टीकरण जोड़ सकते हैं ताकि लोग समझ सकें कि आप क्या कर रहे हैं।
फ्रांज ग्लीक्मैन

6

@Sabin से जवाब के विस्तार के रूप में और एक संकेत यदि कोई दिनांक भाग की तुलना केवल समय के बिना करना चाहता है :

यदि तुलना करने का क्षेत्र टाइप डेटाइम से है और तुलना के लिए केवल दिनांक निर्दिष्ट हैं, तो इन तिथियों को आंतरिक रूप से डेटाइम मान में बदल दिया जाता है। इसका मतलब है कि निम्नलिखित क्वेरी

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

में परिवर्तित हो जाएगा

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

आंतरिक रूप से।

यह बदले में 2010-09-29 से 00:00:00 से अधिक समय के मूल्य वाली वस्तुओं को शामिल नहीं करता है!

इस प्रकार, यदि दिनांक २०१०-०९ -२९ के साथ सभी वस्तुओं को भी शामिल किया जाना चाहिए, तो तुलना करने के लिए क्षेत्र को तारीख में बदलना होगा:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

आप इसे मैन्युअल रूप से कर सकते हैं, अधिक से अधिक या बराबर और कम से कम या बराबर के साथ तुलना करके।

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

हमारे उदाहरण में, हमें किसी विशेष दिन से डेटा पुनर्प्राप्त करने की आवश्यकता है। हम दिन की शुरुआत से दूसरे दिन में नवीनतम दूसरे से तुलना करेंगे।

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

सर्वर साइड या क्लाइंट साइड पर दिनांक कॉन्फ़िगरेशन के साथ कोई समस्या हो सकती है। मैंने इसे कई डेटाबेस पर एक सामान्य समस्या के रूप में पाया है जब मेजबान को स्पेनिश, फ्रेंच या जो कुछ भी कॉन्फ़िगर किया गया है ... जो प्रारूप dd / mm / yyyy या mm / dd / yyyy को प्रभावित कर सकता है।


3
समस्या यह थी कि पुरानी तारीख को नई तारीख से पहले सूचीबद्ध किया गया था।
तत्कालीन जैजग्रैग

1

दिनांक के रूप में बस date_field कास्ट करें

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

दिनांक और समय मानों का उपयोग करते समय, आपको फ़ील्ड को इस रूप में डालना होगा DateTimeऔर नहीं Date। प्रयत्न :

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

0

तारीखों को इधर-उधर करने की कोशिश करें:

2010-09-29 > 2010-01-30?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.