दिनांक / समय सीमा के बीच डेटा का चयन करें


83

मैं MySQL में डेट रेंज के बीच डेटा का चयन कैसे करूं। मेरा datetimeकॉलम 24-घंटे के ज़ुलु समय प्रारूप में है।

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

इन समय अवधि के बीच डेटा होने के बावजूद कुछ भी नहीं लौटाता है। क्या मुझे क्वेरी में टाइप करने के लिए 'से' और 'से' फ़ील्ड में मान को बाध्य करना होगा datetime?


डेटा-प्रकार किसके लिए है game_date?
hjpotter92

1
इसका डेटाटाइम। मुझे लगता है कि मुझे पता चला कि मैं क्यों उलझन में था। मैं mysql के लिए टॉड सॉफ़्टवेयर का उपयोग कर रहा हूं और डिफ़ॉल्ट रूप से यह मेरी तिथि सीमा में उपयोग किए गए प्रारूप में दिनांक प्रदान करता है, यही वजह है कि मैंने उसी का उपयोग किया। इसलिए समस्या मेरी सीमा में आपूर्ति की गई तारीख का प्रारूप थी।
कोडिंगनकोब

अगर मैं यूजेन रीक द्वारा प्रदान किए गए प्रारूप का उपयोग करता हूं तो यह उम्मीद के मुताबिक काम करता है।
कोडिंगनकोब

जवाबों:


144

आपको दिनांक प्रारूप अपडेट करने की आवश्यकता है:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

2
कौन सी तारीख है और कौन सा महीना यहां है?
अरुण

8
दिनांक शाब्दिक का प्रारूप 'YYYY-MM-DD HH: mm: SS' है
यूजेन रीक

13
BETWEEN का उपयोग करना सबसे अच्छा अभ्यास नहीं है, खासकर जब से MySQL अब सब-सेकंड टाइम परिशुद्धता का समर्थन करता है । 23:59:59 का उपयोग करना एक दिन के अंत में एक पूर्ण दूसरा छोटा है। where game_date >= '2012-03-11' and game_date < '2012-05-12'किसी तिथि सीमा को परिभाषित करने का सबसे सटीक तरीका है और किसी भी स्तर पर सटीक तारीख के लिए उप-सेकंड इकाइयों के लिए काम करेगा।
प्रयुक्त_By_Already

3
@Used_By_Already जब 2013 में यह उत्तर दिया गया था कि कोई सब-सेकंड MySQL नहीं था - मुझे अभी तक एक हॉकी खेल 23:59 और 00:00 के बीच एक उप-सेकंड स्टार्ट समय के साथ शुरू होने के बारे में सुना है।
यूजेन रीक

5
यह सब-सेकंड सटीक के साथ MySQL संस्करणों का उपयोग करने वाले पाठकों के लिए है कि मैंने यह टिप्पणी छोड़ दी। MySQL संस्करण 5.6.4 या बाद में आंशिक सेकंड का समर्थन करता है। (दिनांक सीमा किस खेल या उद्देश्य के लिए है।)
Used_By_Already

19

यहाँ दिनांक फ़ंक्शन का उपयोग करने का एक सरल तरीका है:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
क्या मैं अंधा हूं या यह एक प्रदर्शन हत्यारा है? date(game_date)तुलना कैलकुलस वैल्यू के विरुद्ध होगी , न कि एक फील्ड - जिसके परिणामस्वरूप कोई इंडेक्स उपयोग नहीं होता है और हर एक पंक्ति को छुआ जा सकता है (यानी फुल टेबल स्कैन)!
यूजेन रीक

1
@ यूजीनरिक। । । आप सामान्य रूप से सही हैं, यह मानते हुए कि एक सूचकांक है game_date। सूचकांक के बिना भी, तालिका को प्रदर्शन में ध्यान देने योग्य अंतर के लिए मामूली आकार देना होगा। नाम के बारे में कुछ hockey_statsमुझे बताता है कि यह वास्तव में बड़ी तालिका नहीं है।
गॉर्डन लिनोफ

8

एक सरल तरीका:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

आपको शायद STR_TO_DATE फ़ंक्शन का उपयोग करने की आवश्यकता है :

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(यदि game_date एक स्ट्रिंग है, तो आपको उस पर STR_TO_DATE का उपयोग करना पड़ सकता है)


4

MySQL दिनांक प्रारूप यह है: YMD। आप Y / M / D का उपयोग कर रहे हैं। यह गलत है। अपनी क्वेरी को संशोधित करें।

यदि आप Y / M / D की तरह तारीख डालते हैं, तो यह डेटाबेस में शून्य मान डालेगा।

यदि आप PHP और दिनांक का उपयोग कर रहे हैं जो आपको फॉर्म से मिल रहा है तो यह Y / M / D जैसा है, आप इसे स्टेटमेंट का उपयोग करके बदल सकते हैं।

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

एक सरल तरीके से इसे क्वियर किया जा सकता है

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

अगर समय की चिंता नहीं है तो यह काम करता है।

निम्नलिखित समय को भी ध्यान में रखते हुए:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

ध्यान दें कि यह MySQL सर्वर के लिए है।


2

आप या तो STR_TO_DATE फ़ंक्शन का उपयोग कर सकते हैं और आपके द्वारा पोस्ट किए गए प्रारूप के आधार पर अपनी स्वयं की दिनांक पैरामीटर पास कर सकते हैं:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

या बस उस फॉर्मेट का उपयोग करें जिसे MySQL YYYY: MM: DD HH: mm: SS को हैंडल करता है और क्वेरी के रूप में है

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;


2

आपको अपने डेटाबेस पर उस गेम_डेट डेटा को कैसे डाला जाए, इस पर आपको डेट डिफेंस की खोज करनी चाहिए। उदाहरण के लिए यदि आपने लंबी तारीख या छोटी तारीख पर तारीख डाली है।

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

आप BETWEEN का उपयोग भी कर सकते हैं :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

इतना ही आसान।


मैं एक ही कोशिश कर रहा हूं, लेकिन यह ठीक से काम नहीं कर रहा है, यादृच्छिक तिथि-वार डेटा प्राप्त कर रहा है।
मंजीत कुमार नाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.